/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.datamodel.LazyProposta;
import br.jm.financeiro.datamodel.LazyViewEmail;
import br.jm.financeiro.entity.Assunto;
import br.jm.financeiro.entity.Cliente;
import br.jm.financeiro.entity.ClienteEndereco;
import br.jm.financeiro.entity.ClienteTelefoneContato;
import br.jm.financeiro.entity.Empreendimento;
import br.jm.financeiro.entity.EmpreendimentoEndereco;
import br.jm.financeiro.entity.Empresa;
import br.jm.financeiro.entity.Proposta;
import br.jm.financeiro.entity.PropostaCase;
import br.jm.financeiro.entity.PropostaDocumento;
import br.jm.financeiro.entity.PropostaEmail;
import br.jm.financeiro.entity.PropostaEstudoInicial;
import br.jm.financeiro.entity.PropostaEtapaDesc;
import br.jm.financeiro.entity.PropostaEtapaPerc;
import br.jm.financeiro.entity.PropostaListaDocumentos;
import br.jm.financeiro.entity.PropostaModelo;
import br.jm.financeiro.entity.PropostaOrgao;
import br.jm.financeiro.entity.PropostaValor;
import br.jm.financeiro.entity.PropostaValorPerc;
import br.jm.financeiro.entity.ViewEmail;
import br.jm.financeiro.entity.ViewNota;
import br.jm.financeiro.filter.Funcoes;
import br.jm.financeiro.filter.PropostaConverter;
import br.jm.financeiro.filter.SendMail;
import br.jm.financeiro.filter.UploadArquivo;
import br.jm.financeiro.filter.word;
import br.jm.financeiro.sistema.eao.ClienteEao;
import br.jm.financeiro.sistema.eao.EmpreendimentoEao;
import br.jm.financeiro.sistema.eao.EmpresaEao;
import br.jm.financeiro.sistema.eao.PropostaEao;
import br.jm.financeiro.sistema.eao.ViewEmailEao;
import br.jm.financeiro.sistema.eao.ViewNotaEao;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.mail.MessagingException;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletResponse;
import net.sf.jooreports.templates.DocumentTemplate;
import net.sf.jooreports.templates.DocumentTemplateException;
import net.sf.jooreports.templates.DocumentTemplateFactory;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.RowEditEvent;
import org.primefaces.event.TabChangeEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author joao
 */
public class PropostaBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Proposta selectedProposta;
    private LazyDataModel<Proposta> lazyModel;
    private final PropostaEao propostaEAO;
    private String cFiltro = "0";
    private Empreendimento selectedEmpreendimento;
    private FacesMessage msg = null;
    private PropostaEmail selectedPropostaEmail;
    private PropostaDocumento selectedPropostaDocumento;
    private String documentoView;
    private Integer ativaTab = 0;
    private boolean ativa;
    private List<PropostaDocumento> apagaDocumento;
    private LazyDataModel<ViewEmail> viewEmailLazyModel;
    private final ViewEmailEao viewEmailJpa;
    private List<String> viewEmailList;
    private ViewEmail selectedViewEmail;
    private String email;
    private String assunto;
    private String texto;
    private final UploadArquivo arquivo;
    private String cstatus = "1";
    private PropostaModelo selectedPropostaModelo;
    private final Funcoes funcoes = new Funcoes();
    //private final EmpreendimentoEnderecoEao empreendimentoEnderecoJpa;
    private FacesContext ctx;
    private String paginaAtual;
    private PropostaOrgao selectedPropostaOrgao;
    private boolean finaliza;
    private Integer nIdProposta;
    private Integer tabindex = 0;
    private PropostaValor selectedPropostaValor;
    private PropostaValorPerc selectedPropostaValorPerc;
    private PropostaValor selectedPropostaValorTemp;
    private PropostaValorPerc selectedPropostaValorPercTemp;
    private SelectItem[] tipStatusOptions;
    private final String[][] tipStatus = {{"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A"}, {"1 - Nova Proposta", "2 - Estudo em CASE", "3 - Preenchimento dos Documentos Necessários", "4 - Estudos Iniciais", "5 - Elaborando os Orgãos", "6 - Elaborando a Proposta", "7 - Valorização da Proposta", "8 - Proposta Aprovada - Financeiro", "9 - Proposta não Aprovada", "10 - O.S. Cancelada", "11 - Finalizada"}};
    private Empresa selectedEmpresa;
    private final EmpresaEao empresaJpa;
    private EntityManager sessao;
    private String tipStatusValue;
    private List<Proposta> propostaList;
    private ClienteTelefoneContato selectedClienteTelefoneContato;
    private int rowid;
    private final ClienteEao clienteJpa;
    private final EmpreendimentoEao empreendimentoJpa;
    private BigDecimal baseCalculoInicial = new BigDecimal(0);
    private BigDecimal baseCalculo = new BigDecimal(0);
    private BigDecimal baseCalculoMaior = new BigDecimal(0);
    private BigDecimal totalImpostos = new BigDecimal(0);
    private BigDecimal totalImpostosNota;
    private BigDecimal totalImpostosEmpresa;
    private BigDecimal totalImpostosServico;
    private BigDecimal totalImpostosRetido;
    private BigDecimal totalNota;
    private BigDecimal totalLiquido;
    private StreamedContent file;

    private String numNota;
    private Date dataEmissao;
    private Date dataVencimento;
    private Date dataPagamento;
    private String numNota2;
    private Date dataEmissao2;
    private Date dataVencimento2;
    private Date dataPagamento2;
    private BigDecimal vlrMulta2;
    private BigDecimal vlrJuros2;
    private String numNota3;
    private Date dataEmissao3;
    private Date dataVencimento3;
    private Date dataPagamento3;
    private Assunto selectedAssunto;
    private String negrito;
    private String cCaminho;
    private String cArquivo;
    private boolean abrearquivo;
    private String ctipstatus;
    private SelectItem[] corStatusOptions;
    private SelectItem[] empresaOptions;
    private boolean finalizaOS;
    private String console;
    private BigDecimal baseCalculoInicialTemp = new BigDecimal(0);
    private String consoleTemp;

    private final ViewNotaEao viewNotaJpa;
    private List<ViewNota> listViewNota;

    private boolean temjuros;
    private boolean calcula;

    public PropostaBean() throws EaoException {
        FacesContext context = FacesContext.getCurrentInstance();

        propostaEAO = PropostaEao.getInstance();
        viewEmailJpa = ViewEmailEao.getInstance();
        //empreendimentoEnderecoJpa = EmpreendimentoEnderecoEao.getInstance();
        //propostaEtapaDescEAO = PropostaEtapaDescEao.getInstance();
        //propostaValorEAO = PropostaValorEao.getInstance();
        //propostaEtapaPercJpa = PropostaEtapaPercEao.getInstance();
        empresaJpa = EmpresaEao.getInstance();
        clienteJpa = ClienteEao.getInstance();
        empreendimentoJpa = EmpreendimentoEao.getInstance();

        selectedPropostaDocumento = new PropostaDocumento();
        selectedPropostaEmail = new PropostaEmail();
        selectedPropostaValor = new PropostaValor();
        selectedEmpresa = new Empresa();
        arquivo = new UploadArquivo();
        selectedClienteTelefoneContato = new ClienteTelefoneContato();

        selectedPropostaOrgao = new PropostaOrgao();
        selectedProposta = new Proposta();
        this.selectedProposta.setIdEmpresa(new Empresa());
        this.selectedProposta.setIdCliente(new Cliente());
        this.selectedProposta.setPropostaCase(new PropostaCase());
        this.selectedProposta.setPropostaEstudoInicial(new PropostaEstudoInicial());
        this.selectedProposta.setPropostaListaDocumentos(new PropostaListaDocumentos());
        this.selectedProposta.setPropostaOrgao(selectedPropostaOrgao);
        this.selectedPropostaValorTemp = new PropostaValor();
        this.selectedPropostaValorPercTemp = new PropostaValorPerc();

        //List<PropostaDocumento> apagaDocumento2 = new ArrayList<>();
        viewEmailList = new ArrayList<>();

        this.assunto = "";
        this.texto = "";
        this.email = "";

        this.tipStatusOptions = createFilterOptions(tipStatus);
        this.corStatusOptions = createCorFilterOptions();
        this.empresaOptions = createEmpresaFilterOptions();

        this.propostaList = PropostaConverter.propostaList;

        this.documentoView = "/documento/triunfo.pdf";

        paginaAtual = context.getViewRoot().getViewId();

        if (paginaAtual.lastIndexOf("proposta_inicial.xhtml") > -1) {
            cstatus = "1";
            cFiltro = " tip_status = '1' ";
            this.cstatus = "2";
        } else if (paginaAtual.lastIndexOf("proposta_case.xhtml") > -1) {
            cstatus = "2";
            cFiltro = " tip_status = '2' ";
            this.cstatus = "3";
        } else if (paginaAtual.lastIndexOf("proposta_lista_documentos.xhtml") > -1) {
            cstatus = "3";
            cFiltro = " tip_status = '3' ";
            this.cstatus = "4";
        } else if (paginaAtual.lastIndexOf("proposta_estudo_inicial.xhtml") > -1) {
            cstatus = "4";
            cFiltro = " tip_status = '4' ";
            this.cstatus = "5";
        } else if (paginaAtual.lastIndexOf("proposta_orgao.xhtml") > -1) {
            cstatus = "5";
            cFiltro = " tip_status = '5' ";
            this.cstatus = "6";
        } else if (paginaAtual.lastIndexOf("proposta.xhtml") > -1) {
            cstatus = "6";
            cFiltro = " tip_status = '6' ";
            this.cstatus = "7";
        } else if (paginaAtual.lastIndexOf("proposta_valor.xhtml") > -1) {
            cstatus = "7";
            cFiltro = " tip_status = '7' ";
            this.cstatus = "8";
        } else if (paginaAtual.lastIndexOf("ordem_servico_novo.xhtml") > -1) {
            cstatus = "8";
            cFiltro = " (tip_status = '8' or tip_status = 'A' or tip_status = '0') ";
            this.cstatus = "9";
        } else if (paginaAtual.lastIndexOf("proposta_encerrada.xhtml") > -1) {
            cstatus = "9";
            cFiltro = " tip_status = '9' ";
            this.cstatus = "10";
        } else if (paginaAtual.lastIndexOf("ordem_servico_cancelada.xhtml") > -1) {
            cstatus = "0";
            cFiltro = " tip_status = '0' or tip_status = 'A' ";
            this.cstatus = "9";
        } else {
            cFiltro = null;
        }

        lazyModel = new LazyProposta(propostaEAO, cFiltro);

        viewEmailLazyModel = new LazyViewEmail(viewEmailJpa);

        this.console = "";
        this.consoleTemp = "";
        this.viewNotaJpa = ViewNotaEao.getInstance();
        this.listViewNota = new ArrayList<>();
    }

    public Proposta getSelectedProposta() {
        return selectedProposta;
    }

    public void setSelectedProposta(Proposta selectedProposta) throws FileNotFoundException, IOException, EaoException {
        BigDecimal totalEtapa = new BigDecimal(0);
        BigDecimal totalBruto = new BigDecimal(0);
        BigDecimal totalLiquido2 = new BigDecimal(0);
        BigDecimal totalRecebido = new BigDecimal(0);
        BigDecimal totalReceber = new BigDecimal(0);
        BigDecimal custoIss = new BigDecimal(0);
        this.baseCalculoInicial = new BigDecimal(0);
        this.totalImpostosNota = new BigDecimal(0);

        try {
            apagaDocumento = new ArrayList<>();
            this.viewEmailList = new ArrayList<>();
            this.email = "";
            this.assunto = "";
            this.texto = "";

            for (int i = 0; i < selectedProposta.getPropostaDocumentoList().size(); i++) {
                this.selectedPropostaDocumento = selectedProposta.getPropostaDocumentoList().get(i);
                if (this.selectedPropostaDocumento.getArquivo() != null) {
                    this.arquivo.getFile(this.selectedPropostaDocumento);
                }
            }

            if (selectedProposta.getPropostaListaDocumentos() == null) {
                PropostaListaDocumentos selectedPropostaListaDocumentos = new PropostaListaDocumentos();
                selectedPropostaListaDocumentos.setIdProposta(selectedProposta);
                selectedProposta.setPropostaListaDocumentos(selectedPropostaListaDocumentos);

            }

            if (selectedProposta.getPropostaCase() == null) {
                PropostaCase selectedPropostaCase = new PropostaCase();
                selectedPropostaCase.setIdProposta(selectedProposta);
                selectedProposta.setPropostaCase(selectedPropostaCase);

            }

            if (selectedProposta.getPropostaListaDocumentos() == null) {
                PropostaListaDocumentos selectedPropostaListaDocumentos = new PropostaListaDocumentos();
                selectedPropostaListaDocumentos.setIdProposta(selectedProposta);
                selectedProposta.setPropostaListaDocumentos(selectedPropostaListaDocumentos);
            }

            if (selectedProposta.getPropostaOrgao() == null) {
                PropostaOrgao selectedPropostaOrgao2 = new PropostaOrgao();
                selectedPropostaOrgao2.setIdProposta(selectedProposta);
                selectedProposta.setPropostaOrgao(selectedPropostaOrgao2);
            }

            PropostaEstudoInicial selectedPropostaEstudoInicial = new PropostaEstudoInicial();
            if (selectedProposta.getPropostaEstudoInicial() == null) {
                selectedPropostaEstudoInicial.setIdProposta(selectedProposta);
                selectedPropostaEstudoInicial.setLegNota1("");
                selectedPropostaEstudoInicial.setLegNota2("");
                selectedPropostaEstudoInicial.setLegNota3("");
                selectedPropostaEstudoInicial.setLegNota4("");
                selectedPropostaEstudoInicial.setLegNota5("");
                selectedPropostaEstudoInicial.setLegNota6("");
                selectedPropostaEstudoInicial.setLegNota7("");
            } else {
                selectedPropostaEstudoInicial = selectedProposta.getPropostaEstudoInicial();
            }

            if (Funcoes.isEmpty(selectedPropostaEstudoInicial.getLegNota1())) {
                selectedPropostaEstudoInicial.setLegNota1("1. COMÉRCIO E SERVIÇOS:\n"
                        + "Área computável maior que 60.000,00m².\n"
                        + "2. INDUSTRIAL:\n"
                        + "Área computável maior que 20.000,00m².\n"
                        + "3. INSTITUCIONAL:\n"
                        + "Área computável maior que 40.000,00m².\n"
                        + "4. RESIDENCIAL:\n"
                        + "Área computável maior que 80.000,00m².");
            }
            if (Funcoes.isEmpty(selectedPropostaEstudoInicial.getLegNota2())) {
                selectedPropostaEstudoInicial.setLegNota2("Classificam-se como Pólo Gerador de Tráfego:\n"
                        + "1. USO RESIDENCIAL (R)\n"
                        + " - Habitações com 500 vagas ou mais.\n"
                        + "2. USO NÃO RESIDENCIAL (NR)\n"
                        + " - Mais de 280 vagas ou mais.\n"
                        + " - Mais de 120 vagas ou mais em AET (Área Especiais de Tráfego).\n"
                        + "3. OUTROS\n"
                        + " - Sócio-cultural, Lazer e Educação c/ área Computável maior que 2.500,00m².\n"
                        + " - Saúde com área maior que 7.500,00m² de área Computável.\n"
                        + " - Locais de reunião com mais de 500 pessoas.");
            }
            if (Funcoes.isEmpty(selectedPropostaEstudoInicial.getLegNota3())) {
                selectedPropostaEstudoInicial.setLegNota3("1. LOTEAMENTOS - para fins habitacionais.\n"
                        + "2. CONJUNTOS HABITACIONAIS - com abertura ou prolongamento de vias públicas.\n"
                        + "3. DESMEMBRAMENTOS - para fins habitacionais que resultem em mais de 10 lotes  não servidos por infra estrutura: rede de água, rede de coleta de esgotos, guias e sarjetas, energia e iluminação.\n"
                        + "4. CONDOMÍNIOS RESIDENCIAIS:\n"
                        + " - Condomínios horizontais e mistos, com mais de 200 unidades ou  área de terreno superior a 50.000m²\n"
                        + " - Condomínios verticais, com mais de 200 unidades ou área de terreno superior a 50.000,00m², que NÃO sejam servidos por rede de água e de coleta de esgotos, guias e sarjetas, energia e iluminação pública.\n");
            }
            if (Funcoes.isEmpty(selectedPropostaEstudoInicial.getLegNota4())) {
                selectedPropostaEstudoInicial.setLegNota4("\"1. AET 1 - Minianel Viário: vias classificadas pela legislação vigente como Estruturais N1, N3 e Coletoras, inseridas no Minianel Viário;\n"
                        + "2. AET 2 - na área externa ao Minianel Viário: vias classificadas pela legislação vigente como Estruturais N1, N2 e N3; e\n"
                        + "3. AET 3 - áreas de Operação Urbana: em todas as vias, independentemente de sua classificação. \n");
            }
            if (Funcoes.isEmpty(selectedPropostaEstudoInicial.getLegNota5())) {
                selectedPropostaEstudoInicial.setLegNota5(" - Quando em ZEIS, não tem baixa de Outorga.\n");
            }
            if (Funcoes.isEmpty(selectedPropostaEstudoInicial.getLegNota6())) {
                selectedPropostaEstudoInicial.setLegNota6(" - Terrenos com desnível superior a 20% até 30%.\n"
                        + " - Elevação do nivel Térreo.");
            }
            if (Funcoes.isEmpty(selectedPropostaEstudoInicial.getLegNota7())) {
                selectedPropostaEstudoInicial.setLegNota7("Terreno superior à 20.000m² (Curso Sinduscon). Reserva de áreas verdes institucionais no termos do Art. 8º do Dec. 45817/05 - PARSOLO.\n");
            }
            selectedProposta.setPropostaEstudoInicial(selectedPropostaEstudoInicial);

            this.selectedPropostaOrgao = selectedProposta.getPropostaOrgao();
            this.nIdProposta = selectedProposta.getIdProposta();

            if (selectedProposta.getPropostaValorList() != null) {
                for (int i = 0; i < selectedProposta.getPropostaValorList().size(); i++) {
                    this.selectedPropostaValor = selectedProposta.getPropostaValorList().get(i);

                    for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                        this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                        if (!this.selectedPropostaValorPerc.getOrdStatus().equals("C")) {
                            if (j == 0) {
                                totalEtapa = totalEtapa.add(this.selectedPropostaValor.getVlrEtapa());
                            }

                            // CALCULA VALOR LIQUIDO E ISS
                            BigDecimal nValor_Liquido = funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrLiquido() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrLiquido());
                            BigDecimal nValor_IR = new BigDecimal(0);
                            BigDecimal nValor_Bruto = this.selectedPropostaValorPerc.getVlrProposta();
                            BigDecimal nPercIR = selectedProposta.getIdEmpresa().getPercIr();
                            BigDecimal nPercIss = selectedProposta.getIdEmpresa().getPercIss_triunfo();
                            BigDecimal nValor_Iss = new BigDecimal(0);

                            nValor_IR = nValor_Bruto.multiply(nPercIR).divide(new BigDecimal(100));
                            //nValor_Liquido = nValor_Bruto.subtract(nValor_IR);

                            if (selectedProposta.getIdEmpresa().getTipCalculoIss().equals("P")) {
                                nValor_Iss = nValor_Bruto.multiply(nPercIss).divide(new BigDecimal(100));
                            } else {
                                nValor_Iss = nPercIss;
                            }

                            this.selectedPropostaValorPerc.setVlrLiquido(nValor_Liquido);
                            this.selectedPropostaValorPerc.setVlrCustoIss(nValor_Iss);
                            this.selectedPropostaValorPerc.setVlrImposto(this.totalImpostos);

                            if (this.selectedPropostaValorPerc.getVlrMulta() == null) {
                                this.selectedPropostaValorPerc.setVlrMulta(new BigDecimal(0));
                            }
                            if (this.selectedPropostaValorPerc.getVlrJuros() == null) {
                                this.selectedPropostaValorPerc.setVlrJuros(new BigDecimal(0));
                            }

                            this.selectedPropostaValor.getPropostaValorPercList().set(j, this.selectedPropostaValorPerc);

                            if (this.selectedPropostaValorPerc.getOrdStatus().equals("A") || this.selectedPropostaValorPerc.getOrdStatus().equals("F")) {
                                totalReceber = totalReceber.add(this.selectedPropostaValorPerc.getVlrProposta());
                            }

                            totalBruto = totalBruto.add(nValor_Bruto);
                            totalLiquido2 = totalLiquido2.add(nValor_Liquido);
                            totalRecebido = totalRecebido.add(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrPago() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrPago()));
                        }
                    }
                    selectedProposta.getPropostaValorList().set(i, this.selectedPropostaValor);
                }
            }
            if (selectedProposta.getIdEmpresa().getTipCalculoIss().equals("P")) {
                custoIss = totalBruto.multiply(selectedProposta.getIdEmpresa().getPercIss_triunfo()).divide(new BigDecimal(100));
            } else {
                custoIss = selectedProposta.getIdEmpresa().getPercIss_triunfo();
            }
            selectedProposta.setTotalEtapa(totalEtapa);
            selectedProposta.setTotalBruto(totalBruto);
            selectedProposta.setTotalLiquido(totalLiquido2);
            selectedProposta.setTotalRecebido(totalRecebido);
            selectedProposta.setTotalReceber(totalReceber);
            selectedProposta.setCustoIss(custoIss);

            // VALOR MENOR
            selectedProposta.setTotalPercConfins(selectedProposta.getIdEmpresa().getPercCofins().add(selectedProposta.getIdEmpresa().getPercCofins_triunfo()));
            selectedProposta.setTotalPercPis(selectedProposta.getIdEmpresa().getPercPis().add(selectedProposta.getIdEmpresa().getPercPis_triunfo()));
            selectedProposta.setTotalPercCsl(selectedProposta.getIdEmpresa().getPercCsl().add(selectedProposta.getIdEmpresa().getPercCsl_triunfo()));
            selectedProposta.setTotalPercIr(selectedProposta.getIdEmpresa().getPercIr().add(selectedProposta.getIdEmpresa().getPercIr_triunfo()));

            if (selectedProposta.getIdEmpresa().getTipCalculoIss().equals("F")) {
                selectedProposta.setTotalPercIss(new BigDecimal(0.00));
            } else {
                selectedProposta.setTotalPercIss(selectedProposta.getIdEmpresa().getPercIss().add(selectedProposta.getIdEmpresa().getPercIss_triunfo()));
            }

            // VALOR MAIOR
            selectedProposta.setTotalPercConfinsMaior(selectedProposta.getIdEmpresa().getPercCofinsMaior().add(selectedProposta.getIdEmpresa().getPercCofins_triunfoMaior()));
            selectedProposta.setTotalPercPisMaior(selectedProposta.getIdEmpresa().getPercPisMaior().add(selectedProposta.getIdEmpresa().getPercPis_triunfoMaior()));
            selectedProposta.setTotalPercCslMaior(selectedProposta.getIdEmpresa().getPercCslMaior().add(selectedProposta.getIdEmpresa().getPercCsl_triunfoMaior()));
            selectedProposta.setTotalPercIrMaior(selectedProposta.getIdEmpresa().getPercIrMaior().add(selectedProposta.getIdEmpresa().getPercIr_triunfoMaior()));

            if (selectedProposta.getIdEmpresa().getTipCalculoIssMaior().equals("F")) {
                selectedProposta.setTotalPercIssMaior(new BigDecimal(0.00));
            } else {
                selectedProposta.setTotalPercIssMaior(selectedProposta.getIdEmpresa().getPercIssMaior().add(selectedProposta.getIdEmpresa().getPercIss_triunfoMaior()));
            }

            //List<PropostaValor> listPropostaValor = selectedProposta.getPropostaValorList();
            List<PropostaValorPerc> listPropostaValorPerc = new ArrayList<>();

            for (int i = 0; i < selectedProposta.getPropostaValorList().size(); i++) {
                //Ordenar as Etapas
                Collections.sort(selectedProposta.getPropostaValorList());
                //Ordenar PropostaValorPerc
                Collections.sort(selectedProposta.getPropostaValorList().get(i).getPropostaValorPercList());

            }

            if (selectedProposta.getIdEmpresa() == null) {
                selectedProposta.setIdEmpresa(new Empresa());
            }

            this.selectedProposta = selectedProposta;

            if (paginaAtual.lastIndexOf("proposta_valor.xhtml") > -1) {
                criaGrid();
                //apagaArquivo();
            } else if (paginaAtual.lastIndexOf("ordem_servico_novo.xhtml") > -1) {
                apagaArquivo();
            }

        } catch (Exception e) {
            this.selectedProposta = selectedProposta;
        }
    }

    public LazyDataModel<Proposta> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Proposta> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Empreendimento getSelectedEmpreendimento() {
        return selectedEmpreendimento;
    }

    public void setSelectedEmpreendimento(Empreendimento selectedEmpreendimento) {
        this.selectedProposta.setIdCliente(selectedEmpreendimento.getIdCliente());
        this.selectedProposta.setIdEmpreendimento(selectedEmpreendimento);
        this.selectedProposta.setNomEmpreendimento(selectedEmpreendimento.getDscEmpreendimento());
        this.selectedEmpreendimento = selectedEmpreendimento;
    }

    public void preparaInserir(ActionEvent actionEvent) {
        try {
            selectedPropostaDocumento = new PropostaDocumento();
            selectedPropostaEmail = new PropostaEmail();
            selectedEmpreendimento = new Empreendimento();

            apagaDocumento = new ArrayList<>();
            this.selectedProposta = new Proposta();
            this.selectedProposta.setIdEmpresa(new Empresa());
            this.selectedProposta.setIdCliente(new Cliente());
            this.selectedProposta.setPropostaCase(new PropostaCase());
            this.selectedProposta.setPropostaEstudoInicial(new PropostaEstudoInicial());
            this.selectedProposta.setPropostaListaDocumentos(new PropostaListaDocumentos());
            this.selectedProposta.setPropostaOrgao(selectedPropostaOrgao);
            this.selectedProposta.setDatProposta(new Date());
            this.selectedProposta.setDatOs(new Date());
            this.ativa = true;
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Carregar os Dados", null);

            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

    }

    public void inserir(ActionEvent actionEvent) throws EaoException, IOException {
        ctx = FacesContext.getCurrentInstance();

        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        paginaAtual = ctx.getViewRoot().getViewId();
        paginaAtual = paginaAtual.replace("xhtml", "jsf");
        boolean loggedIn = false;

        try {
            if (Valida_Proposta()) {
                // ABRE SESSAO
                this.sessao = propostaEAO.openSessaoLote();
                propostaEAO.openTransaction(this.sessao);

                for (PropostaDocumento apagaDocumento1 : apagaDocumento) {
                    this.selectedPropostaDocumento = apagaDocumento1;
                    this.arquivo.apagar(this.selectedPropostaDocumento.getNomDocumento());
                }

                this.selectedProposta.setIdProposta(null);
                this.selectedProposta.setTipStatus("1");

                if (this.selectedProposta.getCorStatus() == null) {
                    this.selectedProposta.setCorStatus("lawngreen");
                    this.selectedProposta.setDscCorStatus("Em Andamento");
                }

                propostaEAO.create(selectedProposta, "S", sessao);

                this.selectedEmpresa.setNumProposta(this.selectedProposta.getNumProposta());
                empresaJpa.edit(selectedEmpresa, "S", sessao);

                propostaEAO.closeTransaction(this.sessao);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Proposta Inserida com Sucesso: ".concat(selectedProposta.getDscProposta())), selectedProposta.getDscProposta());
                loggedIn = true;
            }

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Inserir ", selectedProposta.getDscProposta());
            propostaEAO.closeSessaoRollback(this.sessao);
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);

            if (loggedIn) {
                selectedProposta = new Proposta();
                selectedPropostaDocumento = new PropostaDocumento();
                selectedPropostaEmail = new PropostaEmail();
                selectedEmpreendimento = new Empreendimento();

                apagaDocumento = new ArrayList<>();

                ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + paginaAtual);
            }

            context.update("frmProposta:messages");

            context.addCallbackParam("loggedIn", loggedIn);
        }
    }

    public void alterar(ActionEvent actionEvent) throws IOException {
        ctx = FacesContext.getCurrentInstance();

        if (!this.finalizaOS) {
            msg = null;
        }

        RequestContext context = RequestContext.getCurrentInstance();
        paginaAtual = ctx.getViewRoot().getViewId();
        paginaAtual = paginaAtual.replace("xhtml", "jsf");
        boolean loggedIn = false;

        try {
            if (Valida_Proposta()) {
                for (PropostaDocumento apagaDocumento1 : apagaDocumento) {
                    this.selectedPropostaDocumento = apagaDocumento1;
                    this.arquivo.apagar(this.selectedPropostaDocumento.getNomDocumento());
                }

                this.selectedProposta.setPropostaOrgao(selectedPropostaOrgao);

                if (this.selectedProposta.getCorStatus() == null) {
                    this.selectedProposta.setCorStatus("lawngreen");
                    this.selectedProposta.setDscCorStatus("Em Andamento");
                }
                propostaEAO.edit(selectedProposta);

                // ATUALIZA CAMPO VALOR DE IMPOSTOS
                String cSql = "update proposta_valor_perc "
                        + "set vlr_imposto = (vlr_proposta - vlr_pago) "
                        + "where vlr_pago > 0 and vlr_imposto = 0 ";

                propostaEAO.executeUpdate(cSql);

                if (!this.finalizaOS) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Proposta Alterada com Sucesso: ".concat(selectedProposta.getDscProposta())), selectedProposta.getDscProposta());
                } else {
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Finalização da O.S. Efetuada com Sucesso!".concat(this.selectedProposta.getDscProposta())), "");
                }
                loggedIn = true;
            }

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Alterar ", selectedProposta.getDscProposta());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);

            if (loggedIn) {
                selectedProposta = new Proposta();
                selectedPropostaDocumento = new PropostaDocumento();
                selectedPropostaEmail = new PropostaEmail();
                selectedEmpreendimento = new Empreendimento();

                apagaDocumento = new ArrayList<>();
                preparaInserir(actionEvent);

                context.update("frmProposta:panel");
                //context.update("frmProposta:tabProposta");
                ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + paginaAtual);
            }
            context.update("frmProposta:messages");
            context.addCallbackParam("loggedIn", loggedIn);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        ctx = FacesContext.getCurrentInstance();

        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        paginaAtual = ctx.getViewRoot().getViewId();
        paginaAtual = paginaAtual.replace("xhtml", "jsf");

        try {
            // Apaga os Arquivos no Disco
            for (int i = 0; i < selectedProposta.getPropostaDocumentoList().size(); i++) {
                this.selectedPropostaDocumento = selectedProposta.getPropostaDocumentoList().get(i);

                this.arquivo.apagar(this.selectedPropostaDocumento.getNomDocumento());
            }

            propostaEAO.destroy(selectedProposta);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Proposta Excluida com Sucesso: ".concat(selectedProposta.getDscProposta())), selectedProposta.getDscProposta());
            ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + paginaAtual);
        } catch (EaoException | IOException e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Excluir ", selectedProposta.getDscProposta());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public PropostaEmail getSelectedPropostaEmail() {
        return selectedPropostaEmail;
    }

    public void setSelectedPropostaEmail(PropostaEmail selectedPropostaEmail) {
        msg = null;

        try {
            if (this.selectedProposta.getIdCliente() == null) {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Obrigatório Selecionar o Cliente antes: ", "");
                this.ativaTab = 0;
                selectedPropostaEmail = new PropostaEmail();
            } else {
                String email2 = selectedPropostaEmail.getEmail().replace("#NOME_CLIENTE#", this.selectedProposta.getIdCliente().getNomCliente());
                String endereco = this.selectedProposta.getIdCliente().getClienteEnderecoList().get(0).getCodLogradouro().getDscLogradouro().concat(", ").concat(this.selectedProposta.getIdCliente().getClienteEnderecoList().get(0).getNumEndereco()).concat(" ").concat(this.selectedProposta.getIdCliente().getClienteEnderecoList().get(0).getDscComplemento()).concat("<br />");
                endereco = endereco.concat(this.selectedProposta.getIdCliente().getClienteEnderecoList().get(0).getCodLogradouro().getCodBairro().getDscBairro()).concat(" - ").concat(this.selectedProposta.getIdCliente().getClienteEnderecoList().get(0).getCodLogradouro().getCodBairro().getCodCidade().getDscCidade()).concat(" - ").concat(this.selectedProposta.getIdCliente().getClienteEnderecoList().get(0).getCodLogradouro().getCodBairro().getCodCidade().getCodUf().getCodUf()).concat("<br />");
                endereco = endereco.concat("C.E.P.: ").concat(this.selectedProposta.getIdCliente().getClienteEnderecoList().get(0).getCodLogradouro().getNumCep());
                email2 = email2.replace("#ENDERECO_CLIENTE#", endereco);
                email2 = email2.replace("#NOME_EMPREENDIMENTO#", this.selectedProposta.getNomEmpreendimento());

                this.selectedProposta.setDscEmail(email2);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "E-Mail Selecionado com Sucesso", "");
            }

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Selecionar: ", "");
            selectedPropostaEmail = new PropostaEmail();
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

        this.selectedPropostaEmail = selectedPropostaEmail;
    }

    public void uploadAction(FileUploadEvent event) {
        msg = null;
        boolean lPassa = false;

        try {
            this.arquivo.fileUpload(event, ".pdf", "/documento/");

            this.arquivo.gravar();

            this.selectedPropostaDocumento = new PropostaDocumento();
            this.selectedPropostaDocumento.setNomDocumento(this.arquivo.getNome());
            this.selectedPropostaDocumento.setArquivo(this.arquivo.insertFile(this.arquivo.getNome()));

            List<PropostaDocumento> propostaDocumentoList = new ArrayList<>();

            if (this.selectedProposta.getPropostaDocumentoList() != null) {
                propostaDocumentoList = this.selectedProposta.getPropostaDocumentoList();
            }

            for (PropostaDocumento propostaDocumentoList1 : propostaDocumentoList) {
                String cArquivo = propostaDocumentoList1.getNomDocumento();
                if (cArquivo.equals(this.arquivo.getNome())) {
                    lPassa = true;
                    break;
                }
            }
            if (!lPassa) {
                propostaDocumentoList.add(selectedPropostaDocumento);
            }

            this.selectedProposta.setPropostaDocumentoList(propostaDocumentoList);
            this.selectedPropostaDocumento.setIdProposta(this.selectedProposta);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Documento Inserido com Sucesso", selectedProposta.getDscProposta());

        } catch (IOException e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir: " + selectedProposta.getDscProposta(), e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void uploadActionDOC(FileUploadEvent event) {
        msg = null;

        try {
            this.arquivo.fileUpload(event, ".docx", "/documento/");

            this.selectedPropostaDocumento = new PropostaDocumento();
            this.selectedPropostaDocumento.setNomDocumento(this.arquivo.getNome());

            List<PropostaDocumento> propostaDocumentoList = new ArrayList<>();

            if (this.selectedProposta.getPropostaDocumentoList() != null) {
                propostaDocumentoList = this.selectedProposta.getPropostaDocumentoList();
            }
            boolean lPassa = false;
            for (PropostaDocumento propostaDocumentoList1 : propostaDocumentoList) {
                String cArquivo = propostaDocumentoList1.getNomDocumento();
                if (cArquivo.equals(this.arquivo.getNome())) {
                    lPassa = true;
                    break;
                }
            }
            if (!lPassa) {
                propostaDocumentoList.add(selectedPropostaDocumento);
            }
            // FAZ O UPLOD DO ARQUIVO
            this.arquivo.gravar();

            this.arquivo.apagar(this.selectedProposta.getNomArquivo());
            this.selectedProposta.setNomArquivo(this.arquivo.getNome());
            this.selectedPropostaDocumento.setIdProposta(this.selectedProposta);
            this.selectedProposta.setPropostaDocumentoList(propostaDocumentoList);

            propostaEAO.edit(this.selectedProposta);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Documento Inserido com Sucesso", selectedProposta.getDscProposta());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir: " + selectedProposta.getDscProposta(), e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public String getDocumentoView() {
        return documentoView;
    }

    public void setDocumentoView(String documentoView) {
        this.documentoView = documentoView;
    }

    public PropostaDocumento getSelectedPropostaDocumento() {
        return selectedPropostaDocumento;
    }

    public void setSelectedPropostaDocumento(PropostaDocumento selectedPropostaDocumento) {
        String cCaminho = "/documento/";

        this.documentoView = cCaminho.concat(selectedPropostaDocumento.getNomDocumento());

        this.selectedPropostaDocumento = selectedPropostaDocumento;
    }

    public Integer getAtivaTab() {
        return ativaTab;
    }

    public void setAtivaTab(Integer ativaTab) {
        this.ativaTab = ativaTab;
    }

    public boolean Valida_Proposta() {
        boolean lReturn = true;

        if (Funcoes.isEmpty(this.selectedProposta.getDscProposta())) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Obrigatório Preencher a Descrição da Proposta ", selectedProposta.getDscProposta());
            lReturn = false;
        } else if (this.selectedProposta.getIdCliente() == null) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Obrigatório Preencher Cliente da Proposta ", selectedProposta.getDscProposta());
            lReturn = false;
        } /*else if (this.selectedProposta.getIdEmail() == null) {
         msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Obrigatório Selecionar um E-Mail Padrão da Proposta ", selectedProposta.getDscProposta());
         lReturn = false;
         }*/

        return lReturn;
    }

    public boolean isAtiva() {
        return ativa;
    }

    public void setAtiva(boolean ativa) {
        this.ativa = ativa;
    }

    public void excluirDocumento(ActionEvent actionEvent) {
        msg = null;

        try {
            apagaDocumento.add(selectedPropostaDocumento);

            this.selectedProposta.getPropostaDocumentoList().remove(this.selectedPropostaDocumento);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Documento Excluido com Sucesso", this.selectedPropostaDocumento.getNomDocumento());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Excluir ", this.selectedPropostaDocumento.getNomDocumento());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void finalizarProposta() throws EaoException, IOException {
        ctx = FacesContext.getCurrentInstance();

        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        paginaAtual = ctx.getViewRoot().getViewId();
        paginaAtual = paginaAtual.replace("xhtml", "jsf");
        boolean loggedIn = false;
        String cNumOs = "";

        try {
            this.sessao = propostaEAO.openSessaoLote();
            propostaEAO.openTransaction(this.sessao);

            Cliente selectedCliente = this.selectedProposta.getIdCliente();
            selectedCliente = clienteJpa.getPorId(selectedCliente.getIdCliente());

            Empreendimento selectedEmpreendimento2 = this.selectedProposta.getIdEmpreendimento();
            selectedEmpreendimento2 = empreendimentoJpa.getPorId(selectedEmpreendimento2.getIdEmpreendimento());

            switch (this.cstatus) {
                case "9":
                    if (this.selectedProposta.getIdCliente().getStaCliente().equals("P")) {
                        this.selectedProposta.getIdCliente().setStaCliente("I");
                        selectedCliente.setStaCliente("I");
                    }
                    if (this.selectedProposta.getIdEmpreendimento().getStaEmpreendimento().equals("P")) {
                        this.selectedProposta.getIdEmpreendimento().setStaEmpreendimento("I");
                        selectedEmpreendimento2.setStaEmpreendimento("I");
                    }
                    break;
                case "8":
                    if (this.selectedProposta.getIdCliente().getStaCliente().equals("P")) {
                        this.selectedProposta.getIdCliente().setStaCliente("A");
                        selectedCliente.setStaCliente("A");
                    }
                    if (this.selectedProposta.getIdEmpreendimento().getStaEmpreendimento().equals("P")) {
                        this.selectedProposta.getIdEmpreendimento().setStaEmpreendimento("A");
                        selectedEmpreendimento2.setStaEmpreendimento("A");
                    }
                    this.selectedProposta.setCorStatus("lawngreen");
                    this.selectedProposta.setDscCorStatus("Em Andamento");
                    this.selectedEmpresa = this.selectedProposta.getIdEmpresa();
                    cNumOs = funcoes.retornaZero(this.selectedEmpresa.getNumOs());
                    this.selectedProposta.setNumOs(cNumOs);
                    this.selectedEmpresa.setNumOs(cNumOs);
                    empresaJpa.edit(selectedEmpresa, "S", sessao);
                    break;
            }

            clienteJpa.edit(selectedCliente, "S", sessao);

            empreendimentoJpa.edit(selectedEmpreendimento2, "S", sessao);

            selectedProposta = propostaEAO.getPorId(this.nIdProposta);
            this.selectedProposta.setTipStatus(this.cstatus);
            this.selectedProposta.setDatOs(new Date());
            this.selectedProposta.setNumOs(cNumOs);
            propostaEAO.edit(selectedProposta, "S", sessao);

            propostaEAO.closeTransaction(sessao);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Etapa da Proposta Finalizada com Sucesso!".concat(selectedProposta.getDscProposta())), "");

            loggedIn = true;
        } catch (Exception e) {
            propostaEAO.closeSessaoRollback(sessao);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Finalizar ", selectedProposta.getDscProposta());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);

            context.update("frmProposta:messages");

            context.addCallbackParam("loggedIn", loggedIn);

            this.finaliza = false;

            if (loggedIn) {
                selectedProposta = new Proposta();
                selectedPropostaDocumento = new PropostaDocumento();
                selectedPropostaEmail = new PropostaEmail();
                selectedEmpreendimento = new Empreendimento();

                apagaDocumento = new ArrayList<>();

                context.update("frmProposta:panel");
                context.update("frmProposta:tabProposta");
                ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + paginaAtual);
            }
        }
    }

    public void enviarEmail(ActionEvent event) throws Exception {
        msg = null;

        try {
            if (Funcoes.isEmpty(this.assunto)) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO ... ASSUNTO não Preenchido!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmptyList(this.viewEmailList)) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO ... E-Mail não Preenchido!", this.selectedProposta.getDscProposta());
            } else {
                for (String viewEmailList1 : this.viewEmailList) {
                    new SendMail().sendMail("triunfosp@gmail.com", viewEmailList1, this.assunto, this.selectedProposta.getDscEmail());
                }
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Envio do E-Mail enviado com SUCESSO!", this.selectedProposta.getDscProposta());
            }
        } catch (MessagingException ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO ... Envio do E-Mail não enviado!", this.selectedProposta.getDscProposta());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

    }

    public LazyDataModel<ViewEmail> getViewEmailLazyModel() {
        return viewEmailLazyModel;
    }

    public void setViewEmailLazyModel(LazyDataModel<ViewEmail> viewEmailLazyModel) {
        this.viewEmailLazyModel = viewEmailLazyModel;
    }

    public List<String> getViewEmailList() {
        return viewEmailList;
    }

    public void setViewEmailList(List<String> viewEmailList) {
        this.viewEmailList = viewEmailList;
    }

    public ViewEmail getSelectedViewEmail() {
        return selectedViewEmail;
    }

    public void setSelectedViewEmail(ViewEmail selectedViewEmail) {
        this.email += selectedViewEmail.getEmail().concat("; ");
        this.viewEmailList.add(selectedViewEmail.getEmail());
        this.selectedViewEmail = selectedViewEmail;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTexto() {
        return texto;
    }

    public void setTexto(String texto) {
        this.texto = texto;
    }

    public void addMessage(String summary, String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public String getAssunto() {
        return assunto;
    }

    public void setAssunto(String assunto) {
        this.assunto = assunto;
    }

    public void abrePDF() {
        //HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        //ServletContext serveletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        try {
            File file2 = new File(this.documentoView);
            byte[] b = fileToByte(file2);
            HttpServletResponse res = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            res.setContentType("application/pdf");
            res.setHeader("Content-disposition", "attachment;filename=" + file2.getName());
            res.getOutputStream().write(b);
            res.getCharacterEncoding();
            FacesContext.getCurrentInstance().responseComplete();

        } catch (Exception e) {
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public static byte[] fileToByte(File imagem) throws Exception {
        FileInputStream fis = new FileInputStream(imagem);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[8192];
        int bytesRead = 0;
        while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
            baos.write(buffer, 0, bytesRead);
        }
        return baos.toByteArray();
    }

    public void abrirDocumento() {
        FacesContext ctx2;
        ctx2 = FacesContext.getCurrentInstance();
        try {
            ctx2.getExternalContext().redirect(ctx2.getExternalContext().getRequestContextPath() + this.documentoView);
        } catch (IOException ex) {
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void exportarDocJOD(ActionEvent actionEvent) {
        String cCaminho = this.arquivo.getRealPath() + "/documento/";
        String cArquivo;
        String cModelo;
        try {
            if (this.selectedProposta.getIdEmpresa().getIdEmpresa() == 1) {
                cModelo = "modelo_timbrado.odt";
            } else {
                cModelo = "modelo_timbrado_pcta.odt";
            }
            DocumentTemplateFactory documentTemplateFactory = new DocumentTemplateFactory();
            DocumentTemplate template = documentTemplateFactory.getTemplate(new File(cCaminho + cModelo));
            Map model = new HashMap();
            model.put("nome", selectedProposta.getModelo().trim());
            cArquivo = selectedProposta.getDscProposta() + ".doc";
            cArquivo = cArquivo.replaceAll(" ", "");

            template.createDocument(model, new FileOutputStream(cCaminho + cArquivo));
            selectedProposta.setNomArquivo(cArquivo);
            propostaEAO.edit(selectedProposta);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Exportação da Proposta efetuada com Sucesso!", selectedProposta.getDscProposta());
        } catch (IOException | DocumentTemplateException | EaoException e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Exportar para Word: " + selectedProposta.getDscProposta(), e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void exportarDocWORD(ActionEvent actionEvent) {
        cCaminho = this.arquivo.getRealPath() + "\\documento\\";
        cArquivo = "";
        String cModelo;
        Date dTimeStamp = new Date();

        try {
            if (this.selectedProposta.getIdEmpresa().getIdEmpresa() == 1) {
                cModelo = "modelo_timbrado.docx";
            } else {
                cModelo = "modelo_timbrado_pcta.docx";
            }

            cArquivo = "Proposta".concat(funcoes.ConverteDateString(dTimeStamp));
            cArquivo = cArquivo.replace(" ", "");
            cArquivo = cArquivo.replace("/", "");
            cArquivo = cArquivo.replace(".", "");
            cArquivo = cArquivo.replace(":", "");
            cArquivo = cArquivo.concat(".docx");

            word app = new word();
            app.gravaArquivo(cCaminho + cModelo, cCaminho + cArquivo, selectedProposta.getModelo());

            selectedProposta.setNomArquivo(cArquivo);
            propostaEAO.edit(selectedProposta);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Exportação da Proposta efetuada com Sucesso!", selectedProposta.getDscProposta());

        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Exportar para Word: " + selectedProposta.getDscProposta(), ex.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
            this.abrearquivo = true;
        }

    }

    public String linkArquivo(String cArquivo) {

        return cArquivo;

    }

    public PropostaModelo getSelectedPropostaModelo() {
        return selectedPropostaModelo;
    }

    public void setSelectedPropostaModelo(PropostaModelo selectedPropostaModelo) throws EaoException {
        ClienteEndereco clienteEndereco = new ClienteEndereco();
        String cEnderecoCliente = "";
        String cModelo = selectedPropostaModelo.getModelo();
        String cNomCliente = this.selectedProposta.getIdCliente().getNomCliente();

        if (this.selectedProposta.getIdCliente().getClienteEnderecoList().size() > 0) {
            clienteEndereco = this.selectedProposta.getIdCliente().getClienteEnderecoList().get(0);

            cEnderecoCliente = clienteEndereco.getCodLogradouro().getDscLogradouro() + " " + clienteEndereco.getNumEndereco() + " " + clienteEndereco.getDscComplemento() + "\n"
                    + clienteEndereco.getCodLogradouro().getCodBairro().getDscBairro() + " - "
                    + clienteEndereco.getCodLogradouro().getCodBairro().getCodCidade().getDscCidade() + " - "
                    + clienteEndereco.getCodLogradouro().getCodBairro().getCodCidade().getCodUf().getCodUf();
        }

        String cNomEmpreendimento = this.selectedProposta.getNomEmpreendimento();
        String cEnderecoEmpreendimento = "";
        String cEnderecosEmpreendimento = "";
        String cDatComCidade = "";
        String cDatSemCidade = "";
        String cAssinaturaEmpresa = "";
        String cAssinaturaCliente = "";

        if (this.selectedProposta.getIdEmpreendimento().getEmpreendimentoEnderecoList().size() > 0) {
            EmpreendimentoEndereco empreendimentoEndereco = this.selectedProposta.getIdEmpreendimento().getEmpreendimentoEnderecoList().get(0);
            cEnderecoEmpreendimento = empreendimentoEndereco.getCodLogradouro().getDscLogradouro() + " " + empreendimentoEndereco.getDscComplemento()
                    + empreendimentoEndereco.getNumEndereco() + "\n"
                    + empreendimentoEndereco.getCodLogradouro().getCodBairro().getDscBairro() + " - "
                    + empreendimentoEndereco.getCodLogradouro().getCodBairro().getCodCidade().getDscCidade() + " - "
                    + empreendimentoEndereco.getCodLogradouro().getCodBairro().getCodCidade().getCodUf().getCodUf();

            cDatComCidade = Funcoes.DataPorExtenso("São Paulo", this.selectedProposta.getDatProposta());
            cDatSemCidade = Funcoes.DataPorExtenso("#", this.selectedProposta.getDatProposta());

            cEnderecosEmpreendimento = "";
            for (int i = 0; i < this.selectedProposta.getIdEmpreendimento().getEmpreendimentoEnderecoList().size(); i++) {
                empreendimentoEndereco = this.selectedProposta.getIdEmpreendimento().getEmpreendimentoEnderecoList().get(i);
                cEnderecosEmpreendimento += empreendimentoEndereco.getCodLogradouro().getDscLogradouro() + " " + empreendimentoEndereco.getDscComplemento()
                        + empreendimentoEndereco.getNumEndereco() + "\n"
                        + empreendimentoEndereco.getCodLogradouro().getCodBairro().getDscBairro() + " - "
                        + empreendimentoEndereco.getCodLogradouro().getCodBairro().getCodCidade().getDscCidade() + " - "
                        + empreendimentoEndereco.getCodLogradouro().getCodBairro().getCodCidade().getCodUf().getCodUf() + "\n";
            }
        }

        cModelo = cModelo.replace("#NOME_CLIENTE#", cNomCliente);
        cModelo = cModelo.replace("#ENDERECO_CLIENTE#", cEnderecoCliente);
        cModelo = cModelo.replace("#NOME_EMPREENDIMENTO#", cNomEmpreendimento);
        cModelo = cModelo.replace("#ENDERECO_EMPREENDIMENTO#", cEnderecoEmpreendimento);
        cModelo = cModelo.replace("#DATA_EXTENSO_COM_CIDADE#", cDatComCidade);
        cModelo = cModelo.replace("#DATA_EXTENSO_SEM_CIDADE#", cDatSemCidade);
        cModelo = cModelo.replace("#ENDERECOS_EMPREENDIMENTO#", cEnderecosEmpreendimento);

        cAssinaturaEmpresa = "Atenciosamente,\n\n\n"
                + funcoes.repete("_", this.selectedProposta.getIdEmpresa().getNomEmpresa().length()) + "\n"
                + "ARQ. PATRÍCIA FERNANDES\n"
                + this.selectedProposta.getIdEmpresa().getNomEmpresa().toUpperCase() + "\n"
                + cDatSemCidade.toUpperCase() + "\n\n\n";
        cModelo = cModelo.replace("#ASSINATURA_EMPRESA#", cAssinaturaEmpresa);

        cAssinaturaCliente = "CIENTE E DE ACORDO:\n\n\n"
                + funcoes.repete("_", cEnderecoCliente.length()) + "           _____/_____/_____\n"
                + "NOME:" + funcoes.repete(" ", cEnderecoCliente.length() + 74) + "           DATA\n"
                + cNomCliente.toUpperCase() + "\n"
                + cEnderecoCliente.toUpperCase();
        cModelo = cModelo.replace("#ASSINATURA_CLIENTE#", cAssinaturaCliente);

        this.selectedProposta.setModelo(cModelo);
        this.selectedProposta.setDscModelo(selectedPropostaModelo.getDscModelo());
        this.selectedProposta.setIdModelo(selectedPropostaModelo);
        this.selectedProposta.setPropostaValorList(new ArrayList<PropostaValor>());

        criaGrid();
        this.tabindex = 0;

        this.selectedPropostaModelo = selectedPropostaModelo;
    }

    public String getCstatus() {
        return cstatus;
    }

    public void setCstatus(String cstatus) {
        this.cstatus = cstatus;
    }

    public PropostaOrgao getSelectedPropostaOrgao() {
        return selectedPropostaOrgao;
    }

    public void setSelectedPropostaOrgao(PropostaOrgao selectedPropostaOrgao) {
        this.selectedPropostaOrgao = selectedPropostaOrgao;
    }

    public boolean isFinaliza() {
        return finaliza;
    }

    public void setFinaliza(boolean finaliza) {
        this.finaliza = finaliza;
    }

    public Integer getnIdProposta() {
        return nIdProposta;
    }

    public void setnIdProposta(Integer nIdProposta) {
        this.nIdProposta = nIdProposta;
    }

    public Integer getTabindex() {
        return tabindex;
    }

    public void setTabindex(Integer tabindex) {
        this.tabindex = tabindex;
    }

    public void criaGrid() throws EaoException {
        if (Funcoes.isEmptyList(this.selectedProposta.getPropostaValorList())) {
            this.selectedProposta.setPropostaValorList(new ArrayList<PropostaValor>());

            for (int i = 0; i < this.selectedProposta.getIdModelo().getIdEtapa().getPropostaEtapaDescList().size(); i++) {
                PropostaEtapaDesc selectedPropostaEtapaDesc = this.selectedProposta.getIdModelo().getIdEtapa().getPropostaEtapaDescList().get(i);

                this.selectedPropostaValor = new PropostaValor();
                this.selectedPropostaValor.setPropostaValorPercList(new ArrayList<PropostaValorPerc>());

                for (int j = 0; j < selectedPropostaEtapaDesc.getPropostaEtapaPercList().size(); j++) {
                    PropostaEtapaPerc selectedPropostaEtapaPerc = selectedPropostaEtapaDesc.getPropostaEtapaPercList().get(j);

                    PropostaValorPerc selectedPropostaValorPerc2 = new PropostaValorPerc();

                    selectedPropostaValorPerc2.setDscPerc(funcoes.tiraMacro(selectedPropostaEtapaPerc.getDscPerc()));
                    selectedPropostaValorPerc2.setPercEtapa(selectedPropostaEtapaPerc.getPercEtapa());

                    String cEtapa = "#VALOR_ETAPA" + (j + 1) + "#" + selectedPropostaEtapaDesc.getNumEtapa().trim() + "#";
                    selectedPropostaValorPerc2.setNumOrdem(cEtapa);

                    selectedPropostaValorPerc2.setVlrProposta(BigDecimal.ZERO);
                    selectedPropostaValorPerc2.setIdPropostaValor(selectedPropostaValor);
                    selectedPropostaValorPerc2.setOrdStatus("A");

                    this.selectedPropostaValor.getPropostaValorPercList().add(selectedPropostaValorPerc2);
                }
                this.selectedPropostaValor.setDscAssunto(selectedPropostaEtapaDesc.getDscEtapa1());
                this.selectedPropostaValor.setDscEtapa("ETAPA " + selectedPropostaEtapaDesc.getNumEtapa().trim());
                this.selectedPropostaValor.setVlrEtapa(BigDecimal.ZERO);
                this.selectedPropostaValor.setIdProposta(selectedProposta);
                this.selectedPropostaValor.setNumEtapa(Integer.parseInt(selectedPropostaEtapaDesc.getNumEtapa()));

                this.selectedProposta.getPropostaValorList().add(selectedPropostaValor);
            }
        }
    }

    public void calculaValor(ActionEvent actionEvent) {
        try {
            for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                    this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                    BigDecimal nValor = this.selectedPropostaValor.getVlrEtapa().multiply(this.selectedPropostaValorPerc.getPercEtapa()).divide(new BigDecimal(100));

                    this.selectedPropostaValorPerc.setVlrProposta(nValor);

                    this.selectedPropostaValorPerc.setIdPropostaValor(selectedPropostaValor);
                    this.selectedPropostaValor.getPropostaValorPercList().set(j, selectedPropostaValorPerc);
                }

                this.selectedProposta.getPropostaValorList().set(i, selectedPropostaValor);
            }

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Valores Calculados com Sucesso!", this.selectedProposta.getDscProposta());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Atualizar os Valores!", this.selectedProposta.getDscProposta());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void transfereValor(ActionEvent actionEvent) {
        boolean lPassa = true;
        String cModelo = this.selectedProposta.getModelo();
        BigDecimal nTotal = new BigDecimal(0);

        try {
            for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                    this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                    if (this.selectedPropostaValorPerc.getVlrProposta().intValue() == 0) {
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... EXISTE VALORES CALCULADOS EM BRANCO!", this.selectedProposta.getDscProposta());
                        lPassa = false;
                        break;
                    }
                }
            }

            if (lPassa) {
                for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                    this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                    for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                        this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                        cModelo = cModelo.replace(this.selectedPropostaValorPerc.getNumOrdem(), funcoes.FormataValor(this.selectedPropostaValorPerc.getVlrProposta(), 2));
                        nTotal = nTotal.add(this.selectedPropostaValorPerc.getVlrProposta());
                    }
                }
                cModelo = cModelo.replace("#TOTAL_PROPOSTA#", "TOTAL GERAL DA PROPOSTA: " + funcoes.FormataValor(nTotal, 2));

                this.selectedProposta.setModelo(cModelo);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Valores Transferidos com Sucesso!", this.selectedProposta.getDscProposta());
                this.tabindex = 1;
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Atualizar os Valores!", this.selectedProposta.getDscProposta());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public SelectItem[] getTipStatusOptions() {
        return tipStatusOptions;
    }

    public void setTipStatusOptions(SelectItem[] tipStatusOptions) {
        this.tipStatusOptions = tipStatusOptions;
    }

    public Empresa getSelectedEmpresa() {
        return selectedEmpresa;
    }

    public void setSelectedEmpresa(Empresa selectedEmpresa) {
        String cNumProposta = funcoes.retornaZero(selectedEmpresa.getNumProposta());
        selectedEmpresa.setNumProposta(cNumProposta);
        this.selectedProposta.setIdEmpresa(selectedEmpresa);
        this.selectedProposta.setNumProposta(cNumProposta);
        this.selectedEmpresa = selectedEmpresa;
    }

    public String getTipStatusValue() {
        return tipStatusValue;
    }

    public void setTipStatusValue(String tipStatusValue) {
        this.tipStatusValue = tipStatusValue;
    }

    private SelectItem[] createFilterOptions(String[][] tipStatus) {
        SelectItem[] options = new SelectItem[12];

        options[0] = new SelectItem("", "Selecione");
        for (int i = 0; i < 11; i++) {
            options[i + 1] = new SelectItem(tipStatus[0][i], tipStatus[1][i]);
        }

        return options;
    }

    public List<Proposta> getPropostaList() {
        return propostaList;
    }

    public void setPropostaList(List<Proposta> propostaList) {
        this.propostaList = propostaList;
    }

    public void onEdit(RowEditEvent event) throws EaoException {
        this.selectedProposta = (Proposta) event.getObject();

        if (Funcoes.isEmpty(this.tipStatusValue)) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione um Status Válido!", this.selectedProposta.getDscStatus());
        } else {
            this.selectedProposta.setTipStatus(this.tipStatusValue.trim());
            if (this.tipStatusValue.trim().equals("A")) {
                this.selectedProposta.setCorStatus("blue");
                this.selectedProposta.setDscCorStatus("Finalizada");
            } else if (this.tipStatusValue.trim().equals("A")) {
                this.selectedProposta.setCorStatus("red");
                this.selectedProposta.setDscCorStatus("Cancelada");
            } else {
                this.selectedProposta.setCorStatus("lawngreen");
                this.selectedProposta.setDscCorStatus("Em Andamento");
            }
            propostaEAO.edit(selectedProposta);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Status Alterado com Sucesso! - ".concat(this.selectedProposta.getDscStatus())), "");
        }

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void verificaBaixa(ActionEvent actionEvent) {
        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;

        BigDecimal nVlrMenor = this.selectedProposta.getIdEmpresa().getBaseCalculo();
        String cMensagem = "";
        this.consoleTemp = "";

        try {
            if (this.baseCalculoInicial.intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Escolher uma Linha para Calcular a Finalização!", this.selectedProposta.getDscProposta());
                context.execute("PF('baixaDialog').hide();");
            } else if (Funcoes.isEmpty(this.numNota2)) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Numero da Nota!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(funcoes.ConverteDateString(dataEmissao2))) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Data de Emissão!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(funcoes.ConverteDateString(dataVencimento2))) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Data de Vencimento!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(funcoes.ConverteDateString(dataPagamento2))) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Data Pagamento!", this.selectedProposta.getDscProposta());
            } else {
                String cDataEmissao = funcoes.ConverteDateString(this.dataEmissao2, "M");

                this.cFiltro = " ord_status <> 'F' and mesano = '".concat(cDataEmissao).concat("' and num_cpf_empreendimento = '").concat(this.selectedProposta.getIdEmpreendimento().getNumCpfEmpreendimento()).concat("' ");
                this.listViewNota = this.viewNotaJpa.getNative("ViewNota", 0, this.viewNotaJpa.getCount("ViewNota"), null, true, null, null, cFiltro);

                baseCalculoInicialTemp = this.baseCalculoInicial;
                if (!this.listViewNota.isEmpty()) {
                    for (ViewNota selectedViewNota : this.listViewNota) {
                        baseCalculoInicialTemp = baseCalculoInicialTemp.add(selectedViewNota.getVlrProposta());
                    }
                }
                if (baseCalculoInicialTemp.intValue() == 0) {
                    this.consoleTemp = "";
                    this.console = "";
                    cMensagem = "Nenhum Valor Calculado!";
                } else if (baseCalculoInicialTemp.compareTo(nVlrMenor) <= 0) {
                    this.console = "CN";
                    this.consoleTemp = "CN";
                    cMensagem = "Valores Calculados a MENOR!";
                } else {
                    this.console = "CM";
                    this.consoleTemp = "CM";
                    cMensagem = "Valores Calculados a MAIOR!";

                }
                // VERIFICA SE ESTA ATRASADO
                if (Funcoes.diferencaEmDias(this.dataVencimento2, dataPagamento2) > 0) {
                    loggedIn = true;
                }

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, cMensagem, this.selectedProposta.getDscProposta());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Finalizar os Valores!", this.selectedProposta.getDscProposta());

        } finally {
            context.addCallbackParam("loggedIn", loggedIn);
            context.update("frmProposta:outNf");
            context.update("frmProposta:tabView");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void sinalizaCalculo(boolean lCalcula) {
        this.calcula = lCalcula;
    }
    
    public void onEditValor(ActionEvent actionEvent) throws EaoException {
        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;

        BigDecimal totalEtapa = new BigDecimal(0);
        BigDecimal totalBruto = new BigDecimal(0);
        BigDecimal totalLiquido2 = new BigDecimal(0);
        BigDecimal totalRecebido = new BigDecimal(0);
        BigDecimal totalReceber = new BigDecimal(0);
        BigDecimal custoIss = new BigDecimal(0);
        BigDecimal nPercIss = selectedProposta.getIdEmpresa().getPercIss_triunfo();
        BigDecimal nVlrMenor = this.selectedProposta.getIdEmpresa().getBaseCalculo();
        BigDecimal nPercMulta = this.selectedProposta.getIdEmpresa().getPercMulta().divide(new BigDecimal(100));
        BigDecimal nPercJuros = this.selectedProposta.getIdEmpresa().getPercJuros().divide(new BigDecimal(100));
        this.baseCalculo = new BigDecimal(0);
        this.baseCalculoMaior = new BigDecimal(0);

        try {
            if (this.baseCalculoInicial.intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Escolher uma Linha para Calcular a Finalização!", this.selectedProposta.getDscProposta());
                context.execute("PF('baixaDialog').hide();");
                context.execute("PF('baixaDialogNf').hide();");
            } else if (Funcoes.isEmpty(this.numNota2)) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Numero da Nota!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(funcoes.ConverteDateString(dataEmissao2))) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Data de Emissão!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(funcoes.ConverteDateString(dataVencimento2))) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Data de Vencimento!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(funcoes.ConverteDateString(dataPagamento2))) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Data Pagamento!", this.selectedProposta.getDscProposta());
            } else {
                // For calculo pelo total
                baseCalculoInicial = this.baseCalculoInicialTemp;
                this.selectedEmpresa = this.selectedProposta.getIdEmpresa();

                for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                    this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                    for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                        this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);
                        this.vlrJuros2 = new BigDecimal(0);
                        this.vlrMulta2 = new BigDecimal(0);

                        if (!this.selectedPropostaValorPerc.getOrdStatus().equals("C")) {
                            if (j == 0) {
                                totalEtapa = totalEtapa.add(this.selectedPropostaValor.getVlrEtapa());
                            }

                            // Calcula valores individuais
                            if (this.selectedPropostaValorPerc.isCalcula()) {
                                this.selectedPropostaValorPerc.setDscNfe(this.numNota2);
                                this.selectedPropostaValorPerc.setDatEmissao(dataEmissao2);
                                this.selectedPropostaValorPerc.setDatVencNota(dataVencimento2);
                                this.selectedPropostaValorPerc.setDatPagamento(dataPagamento2);
                                this.selectedPropostaValorPerc.setCalcula(false);
                                this.selectedPropostaValorPerc.setOrdStatus("P");

                                this.baseCalculoMaior = this.selectedPropostaValorPerc.getVlrProposta();
                                this.baseCalculo = this.selectedPropostaValorPerc.getVlrProposta();

                                if (this.baseCalculoInicial.compareTo(nVlrMenor) <= 0) {
                                    if (this.console.equals("CM")) {
                                        BasecalculoMaior();
                                    } else {
                                        Basecalculo();
                                    }

                                    //this.selectedPropostaValorPerc.setVlrImposto(this.totalImpostosNota);
                                    //this.selectedPropostaValorPerc.setVlrPago(this.totalNota);
                                    //this.selectedPropostaValorPerc.setVlrLiquido(this.totalLiquido);
                                } else {
                                    if (this.console.equals("CN")) {
                                        Basecalculo();
                                    } else {
                                        BasecalculoMaior();
                                    }

                                }
                                BigDecimal nTotalRecebido = this.totalNota;
                                this.selectedPropostaValorPerc.setVlrImposto(this.totalImpostosNota);
                                this.selectedPropostaValorPerc.setVlrLiquido(this.totalLiquido);

                                // CALCULAR JUROS E MULTA
                                if (this.calcula) {
                                    int nDias = funcoes.intervaloDias(this.selectedPropostaValorPerc.getDatVencNota(), this.selectedPropostaValorPerc.getDatPagamento());
                                    if (nDias > 0) {
                                        this.vlrMulta2 = nTotalRecebido.multiply(nPercMulta);
                                        BigDecimal nJurosTemp = nTotalRecebido.multiply(nPercJuros);
                                        nJurosTemp = nJurosTemp.divide(new BigDecimal(30), BigDecimal.ROUND_HALF_DOWN).setScale(2, BigDecimal.ROUND_HALF_DOWN);

                                        this.vlrJuros2 = nJurosTemp.multiply(new BigDecimal(nDias));
                                        this.vlrJuros2 = this.vlrJuros2.setScale(2, BigDecimal.ROUND_HALF_DOWN);
                                    }

                                    nTotalRecebido = nTotalRecebido.add(this.vlrJuros2).add(this.vlrMulta2);
                                }
                                this.selectedPropostaValorPerc.setVlrMulta(this.vlrMulta2);
                                this.selectedPropostaValorPerc.setVlrJuros(this.vlrJuros2);
                                this.selectedPropostaValorPerc.setVlrPago(nTotalRecebido);
                            }

                            if (this.selectedPropostaValorPerc.getOrdStatus().equals("A") || this.selectedPropostaValorPerc.getOrdStatus().equals("F")) {
                                totalReceber = totalReceber.add(this.selectedPropostaValorPerc.getVlrProposta());
                            }

                            this.selectedPropostaValor.getPropostaValorPercList().set(j, selectedPropostaValorPerc);

                            totalBruto = totalBruto.add(this.selectedPropostaValorPerc.getVlrProposta());
                            totalLiquido2 = totalLiquido2.add(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrLiquido() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrLiquido()));
                            totalRecebido = totalRecebido.add(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrPago() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrPago()));

                            if (selectedProposta.getIdEmpresa().getTipCalculoIss().equals("P")) {
                                custoIss = totalBruto.multiply(nPercIss).divide(new BigDecimal(100));
                            } else {
                                custoIss = nPercIss;
                            }
                        }
                    }
                    this.selectedProposta.getPropostaValorList().set(i, selectedPropostaValor);
                }
                this.selectedProposta.setTotalEtapa(totalEtapa);
                this.selectedProposta.setTotalBruto(totalBruto);
                this.selectedProposta.setTotalLiquido(totalLiquido2);
                this.selectedProposta.setTotalRecebido(totalRecebido);
                this.selectedProposta.setTotalReceber(totalReceber);
                this.selectedProposta.setCustoIss(custoIss);

                this.baseCalculo = new BigDecimal(0);
                this.baseCalculoInicial = new BigDecimal(0);
                this.baseCalculoMaior = new BigDecimal(0);
                this.numNota2 = "";
                this.dataEmissao2 = null;
                this.dataVencimento2 = null;
                this.dataPagamento2 = null;
                this.vlrMulta2 = new BigDecimal(0);
                this.vlrJuros2 = new BigDecimal(0);

                loggedIn = true;

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Finalização Efetuada com Sucesso!", this.selectedProposta.getDscProposta());
            }

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Finalizar os Valores!", this.selectedProposta.getDscProposta());
        } finally {
            if (loggedIn) {
                context.execute("PF('baixaDialog').hide();");
                context.execute("PF('baixaDialogNf').hide();");
            } else {
                context.execute("PF('baixaDialogNf').hide();");
            }
            context.addCallbackParam("loggedIn", loggedIn);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.update("frmProposta:tabView");
        }

    }

    public int getRowid() {
        return rowid;
    }

    public void setRowid(int rowid) {
        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();

        try {
            this.tabindex = 1;

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Calculo Efetuado com Sucesso! ", selectedProposta.getDscProposta());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Calcular! ", selectedProposta.getDscProposta());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);

            context.update("frmProposta:tabView");

        }
        this.rowid = rowid;
    }

    public ClienteTelefoneContato getSelectedClienteTelefoneContato() {
        return selectedClienteTelefoneContato;
    }

    public void setSelectedClienteTelefoneContato(ClienteTelefoneContato selectedClienteTelefoneContato) {
        String cContato = selectedClienteTelefoneContato.getNomContato();
        String cModelo = this.selectedProposta.getModelo().replace("#NOME_CONTATO#", cContato);
        this.selectedProposta.setModelo(cModelo);
        this.selectedClienteTelefoneContato = selectedClienteTelefoneContato;
    }

    public BigDecimal getBaseCalculo() {
        return baseCalculo;
    }

    public void setBaseCalculo(BigDecimal baseCalculo) {
        this.baseCalculo = baseCalculo;
    }

    public void Basecalculo() throws EaoException {
        try {
            //COFINS
            selectedProposta.setTotalVlrConfins(baseCalculo.multiply(this.selectedProposta.getTotalPercConfins()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrConfinsNota(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercCofins()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrConfinsTriunfo(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercCofins_triunfo()).divide(new BigDecimal(100)));
            //PIS
            selectedProposta.setTotalVlrPis(baseCalculo.multiply(this.selectedProposta.getTotalPercPis()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrPisNota(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercPis()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrPisTriunfo(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercPis_triunfo()).divide(new BigDecimal(100)));
            //CSL
            selectedProposta.setTotalVlrCsl(baseCalculo.multiply(this.selectedProposta.getTotalPercCsl()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrCslNota(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercCsl()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrCslTriunfo(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercCsl_triunfo()).divide(new BigDecimal(100)));
            //IR
            selectedProposta.setTotalVlrIr(baseCalculo.multiply(this.selectedProposta.getTotalPercIr()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrIrNota(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercIr()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrIrTriunfo(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercIr_triunfo()).divide(new BigDecimal(100)));
            //ISS

            if (this.selectedProposta.getIdEmpresa().getTipCalculoIss().equals("F")) {
                selectedProposta.setTotalVlrIss(new BigDecimal(0));
                selectedProposta.setTotalVlrIssNota(new BigDecimal(0));
                selectedProposta.setTotalVlrIssTriunfo(new BigDecimal(0));
            } else {
                selectedProposta.setTotalVlrIss(baseCalculo.multiply(this.selectedProposta.getTotalPercIss()).divide(new BigDecimal(100)));
                selectedProposta.setTotalVlrIssNota(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercIss()).divide(new BigDecimal(100)));
                selectedProposta.setTotalVlrIssTriunfo(baseCalculo.multiply(this.selectedProposta.getIdEmpresa().getPercIss_triunfo()).divide(new BigDecimal(100)));
            }

            this.totalImpostos = selectedProposta.getTotalVlrConfins().add(selectedProposta.getTotalVlrPis()).add(selectedProposta.getTotalVlrCsl()).add(selectedProposta.getTotalVlrIr()).add(selectedProposta.getTotalVlrIss());
            this.totalImpostosNota = selectedProposta.getTotalVlrConfinsNota().add(selectedProposta.getTotalVlrPisNota()).add(selectedProposta.getTotalVlrCslNota()).add(selectedProposta.getTotalVlrIrNota()).add(selectedProposta.getTotalVlrIssNota());
            this.totalImpostosEmpresa = selectedProposta.getTotalVlrConfinsTriunfo().add(selectedProposta.getTotalVlrPisTriunfo()).add(selectedProposta.getTotalVlrCslTriunfo()).add(selectedProposta.getTotalVlrIrTriunfo()).add(selectedProposta.getTotalVlrIssTriunfo());
            this.totalImpostosServico = selectedProposta.getTotalVlrConfinsNota().add(selectedProposta.getTotalVlrPisNota()).add(selectedProposta.getTotalVlrCslNota());
            this.totalImpostosRetido = this.totalImpostosServico.add(selectedProposta.getTotalVlrIrNota());
            this.totalNota = baseCalculo.subtract(this.totalImpostosNota);
            this.totalLiquido = this.totalNota.subtract(this.totalImpostosEmpresa);

            //msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Calculo Efetuado com Sucesso! ", selectedProposta.getDscProposta());
        } catch (Exception e) {
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public void BasecalculoMaior() throws EaoException {
        try {
            //COFINS
            selectedProposta.setTotalVlrConfinsMaior(baseCalculoMaior.multiply(this.selectedProposta.getTotalPercConfinsMaior()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrConfinsNotaMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercCofinsMaior()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrConfinsTriunfoMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercCofins_triunfoMaior()).divide(new BigDecimal(100)));
            //PIS
            selectedProposta.setTotalVlrPisMaior(baseCalculoMaior.multiply(this.selectedProposta.getTotalPercPisMaior()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrPisNotaMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercPisMaior()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrPisTriunfoMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercPis_triunfoMaior()).divide(new BigDecimal(100)));
            //CSL
            selectedProposta.setTotalVlrCslMaior(baseCalculoMaior.multiply(this.selectedProposta.getTotalPercCslMaior()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrCslNotaMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercCslMaior()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrCslTriunfoMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercCsl_triunfoMaior()).divide(new BigDecimal(100)));
            //IR
            selectedProposta.setTotalVlrIrMaior(baseCalculoMaior.multiply(this.selectedProposta.getTotalPercIrMaior()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrIrNotaMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercIrMaior()).divide(new BigDecimal(100)));
            selectedProposta.setTotalVlrIrTriunfoMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercIr_triunfoMaior()).divide(new BigDecimal(100)));
            //ISS

            if (this.selectedProposta.getIdEmpresa().getTipCalculoIssMaior().equals("F")) {
                selectedProposta.setTotalVlrIssMaior(new BigDecimal(0));
                selectedProposta.setTotalVlrIssNotaMaior(new BigDecimal(0));
                selectedProposta.setTotalVlrIssTriunfoMaior(new BigDecimal(0));
            } else {
                selectedProposta.setTotalVlrIssMaior(baseCalculoMaior.multiply(this.selectedProposta.getTotalPercIssMaior()).divide(new BigDecimal(100)));
                selectedProposta.setTotalVlrIssNotaMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercIssMaior()).divide(new BigDecimal(100)));
                selectedProposta.setTotalVlrIssTriunfoMaior(baseCalculoMaior.multiply(this.selectedProposta.getIdEmpresa().getPercIss_triunfoMaior()).divide(new BigDecimal(100)));
            }

            this.totalImpostos = selectedProposta.getTotalVlrConfinsMaior().add(selectedProposta.getTotalVlrPisMaior()).add(selectedProposta.getTotalVlrCslMaior()).add(selectedProposta.getTotalVlrIrMaior()).add(selectedProposta.getTotalVlrIssMaior());
            this.totalImpostosNota = selectedProposta.getTotalVlrConfinsNotaMaior().add(selectedProposta.getTotalVlrPisNotaMaior()).add(selectedProposta.getTotalVlrCslNotaMaior()).add(selectedProposta.getTotalVlrIrNotaMaior()).add(selectedProposta.getTotalVlrIssNotaMaior());
            this.totalImpostosEmpresa = selectedProposta.getTotalVlrConfinsTriunfoMaior().add(selectedProposta.getTotalVlrPisTriunfoMaior()).add(selectedProposta.getTotalVlrCslTriunfoMaior()).add(selectedProposta.getTotalVlrIrTriunfoMaior()).add(selectedProposta.getTotalVlrIssTriunfoMaior());
            this.totalImpostosServico = selectedProposta.getTotalVlrConfinsNotaMaior().add(selectedProposta.getTotalVlrPisNotaMaior()).add(selectedProposta.getTotalVlrCslNotaMaior());
            this.totalImpostosRetido = this.totalImpostosServico.add(selectedProposta.getTotalVlrIrNotaMaior());
            this.totalNota = baseCalculoMaior.subtract(this.totalImpostosNota);
            this.totalLiquido = this.totalNota.subtract(this.totalImpostosEmpresa);

            //msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Calculo Efetuado com Sucesso! ", selectedProposta.getDscProposta());
        } catch (Exception e) {
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public PropostaValorPerc getSelectedPropostaValorPerc() {
        return selectedPropostaValorPerc;
    }

    public void setSelectedPropostaValorPerc(PropostaValorPerc selectedPropostaValorPerc) {
        this.selectedPropostaValorPerc = selectedPropostaValorPerc;
    }

    public BigDecimal getTotalImpostos() {
        return totalImpostos;
    }

    public void setTotalImpostos(BigDecimal totalImpostos) {
        this.totalImpostos = totalImpostos;
    }

    public BigDecimal getTotalImpostosNota() {
        return totalImpostosNota;
    }

    public void setTotalImpostosNota(BigDecimal totalImpostosNota) {
        this.totalImpostosNota = totalImpostosNota;
    }

    public BigDecimal getTotalImpostosEmpresa() {
        return totalImpostosEmpresa;
    }

    public void setTotalImpostosEmpresa(BigDecimal totalImpostosEmpresa) {
        this.totalImpostosEmpresa = totalImpostosEmpresa;
    }

    public BigDecimal getTotalImpostosServico() {
        return totalImpostosServico;
    }

    public void setTotalImpostosServico(BigDecimal totalImpostosServico) {
        this.totalImpostosServico = totalImpostosServico;
    }

    public BigDecimal getTotalImpostosRetido() {
        return totalImpostosRetido;
    }

    public void setTotalImpostosRetido(BigDecimal totalImpostosRetido) {
        this.totalImpostosRetido = totalImpostosRetido;
    }

    public BigDecimal getTotalNota() {
        return totalNota;
    }

    public void setTotalNota(BigDecimal totalNota) {
        this.totalNota = totalNota;
    }

    public BigDecimal getTotalLiquido() {
        return totalLiquido;
    }

    public void setTotalLiquido(BigDecimal totalLiquido) {
        this.totalLiquido = totalLiquido;
    }

    public void onTabChange(TabChangeEvent event) {
        this.baseCalculo = new BigDecimal(0);
    }

    public BigDecimal getBaseCalculoMaior() {
        return baseCalculoMaior;
    }

    public void setBaseCalculoMaior(BigDecimal baseCalculoMaior) {
        this.baseCalculoMaior = baseCalculoMaior;
    }

    public void abrirWord(ActionEvent actionEvent) {
        try {
            String caminho = this.arquivo.getRealPath() + "documento\\".concat(selectedProposta.getNomArquivo());
            String arquivo2 = selectedProposta.getNomArquivo();
            FileInputStream stream = new FileInputStream(caminho);
            file = new DefaultStreamedContent(stream, caminho, arquivo2);
            //return file;

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Download do Arquivo efetuado com Sucesso!", selectedProposta.getDscProposta());

        } catch (FileNotFoundException ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao fazer Download do Arquivo! " + selectedProposta.getDscProposta(), ex.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

    }

    public void apagarWord() {
        try {
            String caminho = this.arquivo.getRealPath() + "documento\\".concat(selectedProposta.getNomArquivo());
            File fileDelete = new File(caminho);
            fileDelete.delete();

        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao fazer Download do Arquivo! " + selectedProposta.getDscProposta(), ex.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

    }

    public StreamedContent getFile() {
        msg = null;
        try {
            cCaminho = this.arquivo.getRealPath() + "\\documento\\".concat(selectedProposta.getNomArquivo());
            cArquivo = selectedProposta.getNomArquivo();
            FileInputStream stream = new FileInputStream(cCaminho);
            file = new DefaultStreamedContent(stream, cCaminho, cArquivo);

            if (file == null) {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Abrir o Arquivo! " + selectedProposta.getDscProposta(), "");
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Arquivo enviado com Sucesso! " + selectedProposta.getDscProposta(), "");
            }
        } catch (FileNotFoundException ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Abrir o Arquivo! " + selectedProposta.getDscProposta(), ex.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        return file;
    }

    public BigDecimal getBaseCalculoInicial() {
        return baseCalculoInicial;
    }

    public void setBaseCalculoInicial(BigDecimal baseCalculoInicial) {
        this.baseCalculoInicial = baseCalculoInicial;
    }

    public String getNumNota() {
        return numNota;
    }

    public void setNumNota(String numNota) {
        this.numNota = numNota;
    }

    public Date getDataEmissao() {
        return dataEmissao;
    }

    public void setDataEmissao(Date dataEmissao) {
        this.dataEmissao = dataEmissao;
    }

    public Date getDataVencimento() {
        return dataVencimento;
    }

    public void setDataVencimento(Date dataVencimento) {
        this.dataVencimento = dataVencimento;
    }

    public Date getDataPagamento() {
        return dataPagamento;
    }

    public void setDataPagamento(Date dataPagamento) {
        this.dataPagamento = dataPagamento;
    }

    public void somatotal() {
        this.baseCalculoInicial = new BigDecimal(0);
        BigDecimal nVlrMenor = this.selectedProposta.getIdEmpresa().getBaseCalculo();

        try {
            for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                    this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                    if (this.selectedPropostaValorPerc.isCalcula()) {
                        this.baseCalculoInicial = this.baseCalculoInicial.add(this.selectedPropostaValorPerc.getVlrProposta());
                    }
                }
            }
            if (this.baseCalculoInicial.intValue() == 0) {
                this.console = "";
            } else if (this.baseCalculoInicial.compareTo(nVlrMenor) <= 0) {
                this.console = "CN";
            } else {
                this.console = "CM";
            }
        } catch (Exception e) {
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public void retirarBaixa() {
        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;

        BigDecimal totalEtapa = new BigDecimal(0);
        BigDecimal totalBruto = new BigDecimal(0);
        BigDecimal totalLiquido2 = new BigDecimal(0);
        BigDecimal totalRecebido = new BigDecimal(0);
        BigDecimal totalReceber = new BigDecimal(0);
        BigDecimal custoIss = new BigDecimal(0);
        BigDecimal nPercIss = selectedProposta.getIdEmpresa().getPercIss_triunfo();
        this.totalImpostosNota = new BigDecimal(0);

        try {
            if (this.baseCalculoInicial.intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Escolher uma Linha para Calcular a Finalização!", this.selectedProposta.getDscProposta());
                loggedIn = true;
            } else {
                for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                    this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                    for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                        this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                        if (j == 0) {
                            totalEtapa = totalEtapa.add(this.selectedPropostaValor.getVlrEtapa());
                        }

                        if (this.selectedPropostaValorPerc.isCalcula()) {
                            this.selectedPropostaValorPerc.setDscNfe("");
                            this.selectedPropostaValorPerc.setDatEmissao(null);
                            this.selectedPropostaValorPerc.setDatVencNota(null);
                            this.selectedPropostaValorPerc.setDatPagamento(null);
                            this.selectedPropostaValorPerc.setCalcula(false);
                            this.selectedPropostaValorPerc.setVlrPago(new BigDecimal(0));
                            this.selectedPropostaValorPerc.setVlrLiquido(new BigDecimal(0));
                            this.selectedPropostaValorPerc.setVlrJuros(new BigDecimal(0));
                            this.selectedPropostaValorPerc.setVlrMulta(new BigDecimal(0));
                            this.selectedPropostaValorPerc.setOrdStatus("A");
                            this.selectedPropostaValorPerc.setVlrImposto(this.totalImpostos);

                            this.selectedPropostaValor.getPropostaValorPercList().set(j, selectedPropostaValorPerc);
                        }

                        totalBruto = totalBruto.add(this.selectedPropostaValorPerc.getVlrProposta());
                        totalLiquido2 = totalLiquido2.add(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrLiquido() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrLiquido()));

                        if (!this.selectedPropostaValorPerc.getOrdStatus().equals("C")) {
                            totalRecebido = totalRecebido.add(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrPago() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrPago()));
                        }

                        if (selectedProposta.getIdEmpresa().getTipCalculoIss().equals("P")) {
                            custoIss = totalBruto.multiply(nPercIss).divide(new BigDecimal(100));
                        } else {
                            custoIss = nPercIss;
                        }
                        if (this.selectedPropostaValorPerc.getOrdStatus().equals("A") || this.selectedPropostaValorPerc.getOrdStatus().equals("F")) {
                            totalReceber = totalReceber.add(this.selectedPropostaValorPerc.getVlrProposta());
                        }
                        // }
                    }
                    this.selectedProposta.getPropostaValorList().set(i, selectedPropostaValor);

                }

                this.selectedProposta.setTotalEtapa(totalEtapa);
                this.selectedProposta.setTotalBruto(totalBruto);
                this.selectedProposta.setTotalLiquido(totalLiquido2);
                this.selectedProposta.setTotalRecebido(totalRecebido);
                this.selectedProposta.setTotalReceber(totalReceber);
                this.selectedProposta.setCustoIss(custoIss);

                loggedIn = true;

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Retirada da Finalização // Cancelamento Efetuada com Sucesso!", this.selectedProposta.getDscProposta());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Finalizar // Cancelar os Valores!", this.selectedProposta.getDscProposta());
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, e);
        } finally {
            this.baseCalculoInicial = new BigDecimal(0);
            context.addCallbackParam("loggedIn", loggedIn);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.update("frmProposta:tabView");
        }
    }

    public void cancelaEtapa() {
        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;

        BigDecimal totalEtapa = new BigDecimal(0);
        BigDecimal totalBruto = new BigDecimal(0);
        BigDecimal totalLiquido2 = new BigDecimal(0);
        BigDecimal totalRecebido = new BigDecimal(0);
        BigDecimal totalReceber = new BigDecimal(0);
        BigDecimal custoIss = new BigDecimal(0);
        BigDecimal nPercIss = selectedProposta.getIdEmpresa().getPercIss_triunfo();
        this.totalImpostosNota = new BigDecimal(0);

        try {
            if (this.baseCalculoInicial.intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Escolher uma Linha para Calcular a Finalização!", this.selectedProposta.getDscProposta());
                loggedIn = true;
            } else {
                for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                    this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                    for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                        this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                        if (j == 0) {
                            totalEtapa = totalEtapa.add(this.selectedPropostaValor.getVlrEtapa());
                        }

                        if (this.selectedPropostaValorPerc.isCalcula()) {
                            this.selectedPropostaValorPerc.setDscNfe("");
                            this.selectedPropostaValorPerc.setDatEmissao(null);
                            this.selectedPropostaValorPerc.setDatVencNota(null);
                            this.selectedPropostaValorPerc.setDatPagamento(null);
                            this.selectedPropostaValorPerc.setCalcula(false);
                            this.selectedPropostaValorPerc.setVlrPago(new BigDecimal(0));
                            this.selectedPropostaValorPerc.setVlrLiquido(new BigDecimal(0));
                            this.selectedPropostaValorPerc.setOrdStatus("C");
                            this.selectedPropostaValorPerc.setVlrImposto(this.totalImpostos);

                            this.selectedPropostaValor.getPropostaValorPercList().set(j, selectedPropostaValorPerc);
                        }

                        if (!this.selectedPropostaValorPerc.getOrdStatus().equals("C")) {
                            totalRecebido = totalRecebido.add(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrPago() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrPago()));

                            totalBruto = totalBruto.add(this.selectedPropostaValorPerc.getVlrProposta());
                            totalLiquido2 = totalLiquido2.add(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrLiquido() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrLiquido()));

                            if (selectedProposta.getIdEmpresa().getTipCalculoIss().equals("P")) {
                                custoIss = totalBruto.multiply(nPercIss).divide(new BigDecimal(100));
                            } else {
                                custoIss = nPercIss;
                            }
                            if (this.selectedPropostaValorPerc.getOrdStatus().equals("A") || this.selectedPropostaValorPerc.getOrdStatus().equals("F")) {
                                totalReceber = totalReceber.add(this.selectedPropostaValorPerc.getVlrProposta());
                            }
                        }
                    }
                    this.selectedProposta.getPropostaValorList().set(i, selectedPropostaValor);

                }

                this.selectedProposta.setTotalEtapa(totalEtapa);
                this.selectedProposta.setTotalBruto(totalBruto);
                this.selectedProposta.setTotalLiquido(totalLiquido2);
                this.selectedProposta.setTotalRecebido(totalRecebido);
                this.selectedProposta.setTotalReceber(totalReceber);
                this.selectedProposta.setCustoIss(custoIss);

                loggedIn = true;

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cancelamento Efetuado com Sucesso!", this.selectedProposta.getDscProposta());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Cancelar as Etapas!", this.selectedProposta.getDscProposta());
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, e);
        } finally {
            this.baseCalculoInicial = new BigDecimal(0);
            context.addCallbackParam("loggedIn", loggedIn);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.update("frmProposta:tabView");
        }
    }

    public void cancelaOS(ActionEvent actionEvent) throws IOException {
        msg = null;

        ctx = FacesContext.getCurrentInstance();

        RequestContext context = RequestContext.getCurrentInstance();
        paginaAtual = ctx.getViewRoot().getViewId();
        paginaAtual = paginaAtual.replace("xhtml", "jsf");
        try {
            switch (this.ctipstatus) {
                case "0":
                    this.selectedProposta.setTipStatus("0");
                    this.selectedProposta.setCorStatus("red");
                    this.selectedProposta.setDscCorStatus("Cancelada");
                    this.selectedProposta.setDatFechamento(new Date());
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Cancelamento da O.S. Efetuado com Sucesso!".concat(this.selectedProposta.getDscProposta())), "");
                    break;
                case "A":
                    this.selectedProposta.setTipStatus("A");
                    this.selectedProposta.setCorStatus("blue");
                    this.selectedProposta.setDscCorStatus("Finalizada");
                    this.selectedProposta.setDatFechamento(new Date());
                    //msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Finalização da O.S. Efetuada com Sucesso!".concat(this.selectedProposta.getDscProposta())), "");
                    this.finalizaOS = true;
                    this.alterar(actionEvent);
                    break;
                case "8":
                    this.selectedProposta.setTipStatus("8");
                    this.selectedProposta.setCorStatus("lawngreen");
                    this.selectedProposta.setDscCorStatus("Em Andamento");
                    this.selectedProposta.setDatFechamento(null);
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Finalização da O.S. Efetuada com Sucesso!".concat(this.selectedProposta.getDscProposta())), "");
                    break;
            }

            if (!this.finalizaOS) {
                propostaEAO.edit(selectedProposta);
            }

        } catch (EaoException | IOException e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Finalizar/Cancelar a O.S.!", this.selectedProposta.getDscProposta());
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, e);
        } finally {
            this.finalizaOS = false;
            FacesContext.getCurrentInstance().addMessage(null, msg);
            ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + paginaAtual);
        }
    }

    public PropostaValor getSelectedPropostaValor() {
        return selectedPropostaValor;
    }

    public void setSelectedPropostaValor(PropostaValor selectedPropostaValor) {
        this.selectedPropostaValor = selectedPropostaValor;
    }

    public PropostaValor getSelectedPropostaValorTemp() {
        return selectedPropostaValorTemp;
    }

    public void setSelectedPropostaValorTemp(PropostaValor selectedPropostaValorTemp) {
        this.selectedPropostaValorTemp = selectedPropostaValorTemp;
    }

    public PropostaValorPerc getSelectedPropostaValorPercTemp() {
        return selectedPropostaValorPercTemp;
    }

    public void setSelectedPropostaValorPercTemp(PropostaValorPerc selectedPropostaValorPercTemp) {
        this.selectedPropostaValorPercTemp = selectedPropostaValorPercTemp;
    }

    public void criarAporte() {
        List<PropostaValorPerc> propostaValorPercListTemp = new ArrayList();

        this.selectedPropostaValorTemp = new PropostaValor();
        this.selectedPropostaValorTemp.setIdProposta(this.selectedProposta);
        this.selectedPropostaValorTemp.setVlrEtapa(new BigDecimal(0));
        //this.selectedPropostaValorTemp.setNumEtapa(0);

        this.selectedPropostaValorPercTemp = new PropostaValorPerc();
        this.selectedPropostaValorPercTemp.setIdPropostaValor(selectedPropostaValorTemp);
        this.selectedPropostaValorPercTemp.setVlrCustoIss(new BigDecimal(0));
        this.selectedPropostaValorPercTemp.setVlrLiquido(new BigDecimal(0));
        this.selectedPropostaValorPercTemp.setVlrPago(new BigDecimal(0));
        this.selectedPropostaValorPercTemp.setVlrProposta(new BigDecimal(0));
        this.selectedPropostaValorPercTemp.setVlrImposto(new BigDecimal(0));
        this.selectedPropostaValorPercTemp.setVlrMulta(new BigDecimal(0));
        this.selectedPropostaValorPercTemp.setVlrJuros(new BigDecimal(0));

        propostaValorPercListTemp.add(selectedPropostaValorPercTemp);
        this.selectedPropostaValorTemp.setPropostaValorPercList(propostaValorPercListTemp);
    }

    public void onEditAporte(ActionEvent actionEvent) throws EaoException {
        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;

        BigDecimal totalEtapa = this.selectedProposta.getTotalEtapa();
        BigDecimal totalBruto = this.selectedProposta.getTotalBruto();
        BigDecimal totalLiquido2 = this.selectedProposta.getTotalLiquido();
        BigDecimal totalRecebido = this.selectedProposta.getTotalRecebido();
        BigDecimal totalReceber = this.selectedProposta.getTotalReceber();
        BigDecimal custoIss = this.selectedProposta.getCustoIss();
        BigDecimal nPercIss = selectedProposta.getIdEmpresa().getPercIss_triunfo();
        this.baseCalculo = new BigDecimal(0);
        this.baseCalculoMaior = new BigDecimal(0);

        try {
            if (this.selectedPropostaValorTemp.getNumEtapa() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Digitar Numero da Etapa!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(this.selectedPropostaValorTemp.getDscEtapa())) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher o Campo Etapa!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(this.selectedPropostaValorTemp.getDscAssunto())) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher o Campo Assunto!", this.selectedProposta.getDscProposta());
            } else if (this.selectedPropostaValorTemp.getVlrEtapa().intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher o Campo Valor!", this.selectedProposta.getDscProposta());
            } else if (this.selectedPropostaValorPercTemp.getPercEtapa().intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher o Campo Percentual!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(this.selectedPropostaValorPercTemp.getDscPerc())) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher o Campo Evento!", this.selectedProposta.getDscProposta());
            } else if (this.selectedPropostaValorPercTemp.getVlrProposta().intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher o Campo Valor Bruto!", this.selectedProposta.getDscProposta());
            } else {
                if (this.selectedPropostaValorPercTemp.getVlrPago().intValue() > 0 && (!this.selectedPropostaValorPercTemp.getOrdStatus().equals("P"))) {
                    this.selectedPropostaValorPercTemp.setVlrPago(new BigDecimal(0));
                }

                totalReceber = totalReceber.add(this.selectedPropostaValorPercTemp.getVlrProposta());
                totalEtapa = totalEtapa.add(this.selectedPropostaValorTemp.getVlrEtapa());
                totalBruto = totalBruto.add(this.selectedPropostaValorPercTemp.getVlrProposta());
                totalLiquido2 = totalLiquido2.add(funcoes.iifBigDecimal(this.selectedPropostaValorPercTemp.getVlrLiquido() == null, new BigDecimal(0), this.selectedPropostaValorPercTemp.getVlrLiquido()));
                totalRecebido = totalRecebido.add(funcoes.iifBigDecimal(this.selectedPropostaValorPercTemp.getVlrPago() == null, new BigDecimal(0), this.selectedPropostaValorPercTemp.getVlrPago()));

                if (selectedProposta.getIdEmpresa().getTipCalculoIss().equals("P")) {
                    custoIss = totalBruto.multiply(nPercIss).divide(new BigDecimal(100));
                } else {
                    custoIss = nPercIss;
                }
                // TRANSFERE APORTE PARA A ORDEM DE SERVICO
                String cNumOrdem = "#VALOR_ETAPA".concat(selectedPropostaValorTemp.getNumEtapa().toString()).concat("#1#");
                this.selectedPropostaValorPercTemp.setNumOrdem(cNumOrdem);
                this.selectedPropostaValorPercTemp.setVlrCustoIss(custoIss);
                this.selectedPropostaValorPercTemp.setIdPropostaValor(selectedPropostaValorTemp);
                this.selectedPropostaValorTemp.setPropostaValorPercList(new ArrayList<PropostaValorPerc>());
                this.selectedPropostaValorTemp.getPropostaValorPercList().add(selectedPropostaValorPercTemp);

                this.selectedPropostaValorTemp.setIdProposta(selectedProposta);
                this.selectedProposta.getPropostaValorList().add(selectedPropostaValorTemp);

                this.selectedProposta.setTotalEtapa(totalEtapa);
                this.selectedProposta.setTotalBruto(totalBruto);
                this.selectedProposta.setTotalLiquido(totalLiquido2);
                this.selectedProposta.setTotalRecebido(totalRecebido);
                this.selectedProposta.setTotalReceber(totalReceber);
                this.selectedProposta.setCustoIss(custoIss);

                loggedIn = true;

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Aporte Criado com Sucesso!", this.selectedProposta.getDscProposta());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Criar Aporte!", this.selectedProposta.getDscProposta());
        } finally {
            this.baseCalculo = new BigDecimal(0);
            this.baseCalculoInicial = new BigDecimal(0);
            this.baseCalculoMaior = new BigDecimal(0);
            this.numNota = "";
            this.dataEmissao = null;
            this.dataVencimento = null;
            this.dataPagamento = null;
            context.addCallbackParam("loggedIn", loggedIn);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.update("frmProposta:tabView");
        }

    }

    public void retirarLinha() {
        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;

        BigDecimal totalEtapa = this.selectedProposta.getTotalEtapa();
        BigDecimal totalBruto = this.selectedProposta.getTotalBruto();
        BigDecimal totalLiquido2 = this.selectedProposta.getTotalLiquido();
        BigDecimal totalRecebido = this.selectedProposta.getTotalRecebido();
        BigDecimal totalReceber = this.selectedProposta.getTotalReceber();
        BigDecimal custoIss = this.selectedProposta.getCustoIss();
        BigDecimal nPercIss = selectedProposta.getIdEmpresa().getPercIss_triunfo();
        this.totalImpostosNota = new BigDecimal(0);

        List<PropostaValor> propostaValorList = new ArrayList<PropostaValor>();

        try {
            if (this.baseCalculoInicial.intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Escolher uma Linha para Calcular a Finalização!", this.selectedProposta.getDscProposta());
                loggedIn = true;
            } else {
                for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                    this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                    for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                        this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                        if (this.selectedPropostaValorPerc.isCalcula()) {
                            this.selectedPropostaValorPerc.setDscNfe("");
                            this.selectedPropostaValorPerc.setDatEmissao(null);
                            this.selectedPropostaValorPerc.setDatVencNota(null);
                            this.selectedPropostaValorPerc.setDatPagamento(null);
                            this.selectedPropostaValorPerc.setCalcula(false);
                            this.selectedPropostaValorPerc.setVlrPago(new BigDecimal(0));
                            this.selectedPropostaValorPerc.setVlrLiquido(new BigDecimal(0));
                            this.selectedPropostaValorPerc.setOrdStatus("A");
                            this.selectedPropostaValorPerc.setVlrImposto(this.totalImpostos);

                            this.selectedPropostaValor.getPropostaValorPercList().set(j, selectedPropostaValorPerc);
                            propostaValorList.add(selectedPropostaValor);

                            if (j == 0) {
                                totalEtapa = totalEtapa.subtract(this.selectedPropostaValor.getVlrEtapa());
                            }
                            totalBruto = totalBruto.subtract(this.selectedPropostaValorPerc.getVlrProposta());
                            totalLiquido2 = totalLiquido2.subtract(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrLiquido() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrLiquido()));

                            if (!this.selectedPropostaValorPerc.getOrdStatus().equals("C")) {
                                totalRecebido = totalRecebido.subtract(funcoes.iifBigDecimal(this.selectedPropostaValorPerc.getVlrPago() == null, new BigDecimal(0), this.selectedPropostaValorPerc.getVlrPago()));
                            }

                            if (selectedProposta.getIdEmpresa().getTipCalculoIss().equals("P")) {
                                custoIss = totalBruto.multiply(nPercIss).divide(new BigDecimal(100));
                            } else {
                                custoIss = nPercIss;
                            }
                            if (this.selectedPropostaValorPerc.getOrdStatus().equals("A") || this.selectedPropostaValorPerc.getOrdStatus().equals("F")) {
                                totalReceber = totalReceber.subtract(this.selectedPropostaValorPerc.getVlrProposta());
                            }
                        }
                    }
                    this.selectedProposta.getPropostaValorList().set(i, selectedPropostaValor);
                }

                this.selectedProposta.getPropostaValorList().removeAll(propostaValorList);

                this.selectedProposta.setTotalEtapa(totalEtapa);
                this.selectedProposta.setTotalBruto(totalBruto);
                this.selectedProposta.setTotalLiquido(totalLiquido2);
                this.selectedProposta.setTotalRecebido(totalRecebido);
                this.selectedProposta.setTotalReceber(totalReceber);
                this.selectedProposta.setCustoIss(custoIss);

                loggedIn = true;

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Retirada da(s) Linha(s) Efetuada com Sucesso!", this.selectedProposta.getDscProposta());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Retirar a(s) Linhas!", this.selectedProposta.getDscProposta());
            Logger.getLogger(PropostaBean.class.getName()).log(Level.SEVERE, null, e);
        } finally {
            this.baseCalculoInicial = new BigDecimal(0);
            context.addCallbackParam("loggedIn", loggedIn);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.update("frmProposta:tabView");
        }
    }

    public void onEditLanca(ActionEvent actionEvent) throws EaoException {
        msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;
        BigDecimal nVlrMenor = this.selectedProposta.getIdEmpresa().getBaseCalculo();

        try {
            if (this.baseCalculoInicial.intValue() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Escolher uma Linha para Calcular a Finalização!", this.selectedProposta.getDscProposta());
                loggedIn = true;
            } else if (Funcoes.isEmpty(this.numNota3)) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Numero da Nota!", this.selectedProposta.getDscProposta());
            } else if (Funcoes.isEmpty(funcoes.ConverteDateString(dataEmissao3))) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Preencher Data de Emissão!", this.selectedProposta.getDscProposta());
            } else {
                for (int i = 0; i < this.selectedProposta.getPropostaValorList().size(); i++) {
                    this.selectedPropostaValor = this.selectedProposta.getPropostaValorList().get(i);

                    for (int j = 0; j < this.selectedPropostaValor.getPropostaValorPercList().size(); j++) {
                        this.selectedPropostaValorPerc = this.selectedPropostaValor.getPropostaValorPercList().get(j);

                        if (!this.selectedPropostaValorPerc.getOrdStatus().equals("C")) {
                            // Calcula valores individuais
                            if (this.selectedPropostaValorPerc.isCalcula()) {
                                this.selectedPropostaValorPerc.setDscNfe(this.numNota3);
                                this.selectedPropostaValorPerc.setDatEmissao(dataEmissao3);
                                this.selectedPropostaValorPerc.setDatVencNota(dataVencimento3);
                                this.selectedPropostaValorPerc.setCalcula(false);
                                this.selectedPropostaValorPerc.setOrdStatus("F");

                                this.baseCalculo = this.selectedPropostaValorPerc.getVlrProposta();
                                this.baseCalculoMaior = this.selectedPropostaValorPerc.getVlrProposta();

                                if (this.baseCalculoInicial.compareTo(nVlrMenor) <= 0) {
                                    if (this.console.equals("CM")) {
                                        BasecalculoMaior();
                                    } else {
                                        Basecalculo();
                                    }

                                    this.selectedPropostaValorPerc.setVlrImposto(this.totalImpostosNota);
                                } else {
                                    if (this.console.equals("CN")) {
                                        Basecalculo();
                                    } else {
                                        BasecalculoMaior();
                                    }

                                    this.selectedPropostaValorPerc.setVlrImposto(this.totalImpostosNota);
                                }
                            }

                            this.selectedPropostaValor.getPropostaValorPercList().set(j, selectedPropostaValorPerc);
                        }
                    }
                    this.selectedProposta.getPropostaValorList().set(i, selectedPropostaValor);
                }

                loggedIn = true;

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Lançamento da Nota Fiscal Efetuada com Sucesso!", this.selectedProposta.getDscProposta());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Lançar a Nota Fiscal!", this.selectedProposta.getDscProposta());
        } finally {
            this.numNota3 = "";
            this.dataEmissao3 = null;
            this.dataVencimento3 = null;

            context.addCallbackParam("loggedIn", loggedIn);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.update("frmProposta:tabView");
        }

    }

    public Assunto getSelectedAssunto() {
        return selectedAssunto;
    }

    public void setSelectedAssunto(Assunto selectedAssunto) {
        String cAssunto = selectedAssunto.getDscAssunto();
        String cModelo = this.selectedProposta.getModelo().replace("#ASSUNTO_EMPREENDIMENTO#", cAssunto);
        this.selectedProposta.setModelo(cModelo);

        this.selectedAssunto = selectedAssunto;
    }

    public String getNumNota2() {
        return numNota2;
    }

    public void setNumNota2(String numNota2) {
        this.numNota2 = numNota2;
    }

    public Date getDataEmissao2() {
        return dataEmissao2;
    }

    public void setDataEmissao2(Date dataEmissao2) {
        this.dataEmissao2 = dataEmissao2;
    }

    public Date getDataVencimento2() {
        return dataVencimento2;
    }

    public void setDataVencimento2(Date dataVencimento2) {
        this.dataVencimento2 = dataVencimento2;
    }

    public Date getDataPagamento2() {
        return dataPagamento2;
    }

    public void setDataPagamento2(Date dataPagamento2) {
        this.dataPagamento2 = dataPagamento2;
    }

    public String getNumNota3() {
        return numNota3;
    }

    public void setNumNota3(String numNota3) {
        this.numNota3 = numNota3;
    }

    public Date getDataEmissao3() {
        return dataEmissao3;
    }

    public void setDataEmissao3(Date dataEmissao3) {
        this.dataEmissao3 = dataEmissao3;
    }

    public Date getDataVencimento3() {
        return dataVencimento3;
    }

    public void setDataVencimento3(Date dataVencimento3) {
        this.dataVencimento3 = dataVencimento3;
    }

    public Date getDataPagamento3() {
        return dataPagamento3;
    }

    public void setDataPagamento3(Date dataPagamento3) {
        this.dataPagamento3 = dataPagamento3;
    }

    public String getNegrito() {
        return negrito;
    }

    public void setNegrito(String negrito) {
        this.negrito = negrito;
    }

    public void exportarDocWORD2() {
        cCaminho = this.arquivo.getRealPath() + "\\documento\\";
        cArquivo = "";
        String cModelo;

        try {
            if (this.selectedProposta.getIdEmpresa().getIdEmpresa() == 1) {
                cModelo = "modelo_timbrado.docx";
            } else {
                cModelo = "modelo_timbrado_pcta.docx";
            }

            cArquivo = selectedProposta.getDscProposta() + ".docx";
            cArquivo = cArquivo.replaceAll(" ", "");

            word app = new word();
            app.gravaArquivo(cCaminho + cModelo, cCaminho + cArquivo, selectedProposta.getModelo());

            selectedProposta.setNomArquivo(cArquivo);
            propostaEAO.edit(selectedProposta);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Exportação da Proposta efetuada com Sucesso!", selectedProposta.getDscProposta());

        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Exportar para Word: " + selectedProposta.getDscProposta(), ex.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

    }

    public void apagaArquivo() {
        cCaminho = this.arquivo.getRealPath() + "\\documento\\";
        cArquivo = selectedProposta.getDscProposta() + ".docx";
        cArquivo = cArquivo.replaceAll(" ", "");
        funcoes.apagarArquivo(cCaminho + cArquivo);
        this.abrearquivo = false;
    }

    public boolean isAbrearquivo() {
        return abrearquivo;
    }

    public void setAbrearquivo(boolean abrearquivo) {
        this.abrearquivo = abrearquivo;
    }

    public String getCtipstatus() {
        return ctipstatus;
    }

    public void setCtipstatus(String ctipstatus) {
        this.ctipstatus = ctipstatus;
    }

    public SelectItem[] getCorStatusOptions() {
        return corStatusOptions;
    }

    public void setCorStatusOptions(SelectItem[] corStatusOptions) {
        this.corStatusOptions = corStatusOptions;
    }

    private SelectItem[] createCorFilterOptions() {
        SelectItem[] options = new SelectItem[4];

        options[0] = new SelectItem("", "Selecione");
        options[1] = new SelectItem("lawngreen", "Em Andamento");
        options[2] = new SelectItem("blue", "Finalizada");
        options[3] = new SelectItem("red", "Cancelada");

        return options;
    }

    public SelectItem[] getEmpresaOptions() {
        return empresaOptions;
    }

    public void setEmpresaOptions(SelectItem[] empresaOptions) {
        this.empresaOptions = empresaOptions;
    }

    private SelectItem[] createEmpresaFilterOptions() throws EaoException {
        List<Empresa> empresaList = empresaJpa.getNative("Empresa", 0, empresaJpa.getCount("Empresa"), null, true, null, null, null);
        SelectItem[] options = new SelectItem[empresaList.size() + 1];

        options[0] = new SelectItem("", "Selecione");
        for (int i = 0; i < empresaList.size(); i++) {
            options[i + 1] = new SelectItem(empresaList.get(i).getNomEmpresa(), empresaList.get(i).getNomEmpresa());
        }

        return options;
    }

    public String getConsole() {
        return console;
    }

    public void setConsole(String console) {
        if (!this.consoleTemp.isEmpty() && console.isEmpty()) {
            console = this.consoleTemp;
        }
        this.console = console;
    }

    public List<ViewNota> getListViewNota() {
        return listViewNota;
    }

    public void setListViewNota(List<ViewNota> listViewNota) {
        this.listViewNota = listViewNota;
    }

    public BigDecimal getBaseCalculoInicialTemp() {
        return baseCalculoInicialTemp;
    }

    public void setBaseCalculoInicialTemp(BigDecimal baseCalculoInicialTemp) {
        this.baseCalculoInicialTemp = baseCalculoInicialTemp;
    }

    public BigDecimal getVlrMulta2() {
        if (vlrMulta2 == null) {
            vlrMulta2 = new BigDecimal(0);
        }
        return vlrMulta2;
    }

    public void setVlrMulta2(BigDecimal vlrMulta2) {
        this.vlrMulta2 = vlrMulta2;
    }

    public BigDecimal getVlrJuros2() {
        if (vlrJuros2 == null) {
            vlrJuros2 = new BigDecimal(0);
        }
        return vlrJuros2;
    }

    public void setVlrJuros2(BigDecimal vlrJuros2) {
        this.vlrJuros2 = vlrJuros2;
    }

    public boolean isTemjuros() {
        return temjuros;
    }

    public void setTemjuros(boolean temjuros) {
        this.temjuros = temjuros;
    }

    public boolean isCalcula() {
        return calcula;
    }

    public void setCalcula(boolean calcula) {
        this.calcula = calcula;
    }

}
